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寄存器读取标志,如果它之前放在其中一个?
答案 0 :(得分:2)
答案是它取决于特定编译器的实现细节
const正确性的主要目的是防止自己犯下诚实的错误并编写更易于维护的更直观的代码
编译器优化应该(几乎)永远不会成为制作const
内容的标准。
一个好的编译器可能会应用它的优化并内联const
变量,其他人可能不会
某些因素,如果某个地方采用const
变量的地址,也可能影响编译器处理它的方式。
最后也是最重要的,不管编译器在声明变量const
后如何处理它,你的代码 总是 假设它是const,它永远不应该修改,任何hackery修改它都会导致未定义的行为。