1
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 寄存器中读取标志,如果它之前放置在其中之一中?

4

1 回答 1

2

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

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

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

于 2012-06-06T09:10:24.083 回答