编译器是否假定私有 const 成员*从不*更改

does the compiler assume that private const members *never* change?

本文关键字:成员 从不 更改 const 是否 编译器      更新时间:2023-10-16
class A{
    const size_t number;
public:
    A(size_t number): number(number) {}
    void f(){
        //read number, possibly save in CPU register
        //call a function that the compiler can't inspect
        //    so it should assume that anything in the program state changed
        //read number again
    }

在那里,它再次读取number,编译器(如果优化已打开)是否仍然假设它不会更改,因为它是const,因此从 CPU 寄存器读取标志,如果它之前被放置在其中一个中?

答案是 它取决于特定编译器的实现细节。
const 正确性的主要目的是防止自己犯诚实的错误并编写更直观的易于维护的代码。
编译器优化(几乎)永远不应该是使某些东西const的标准。

一个好的编译器可能会应用其优化并内联const变量,而其他人可能不会。
一些因素(例如const变量的地址是否位于某个位置)也可能影响编译器处理它的方式。

最后也是最重要的一点,无论编译器如何处理它,一旦你声明了一个变量const,你的代码应该始终假设它是常量,它不应该被修改,用任何黑客修改它都会导致未定义的行为。