编译器是否假定私有 const 成员*从不*更改
does the compiler assume that private const members *never* change?
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
,你的代码应该始终假设它是常量,它不应该被修改,用任何黑客修改它都会导致未定义的行为。
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 助记符和指向成员语法的指针
- 用于访问容器<T>数据成员的正确 API
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 数组的指针从不分段故障
- 嵌套在类中时无法设置成员数据
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 将函数类成员映射到类本身内部
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何从不同类的静态成员函数访问非静态Qt-Ui函数
- 编译器是否假定私有 const 成员*从不*更改
- 强制 clang 为类模板实例化的从不引用的静态成员函数发出代码
- 如果从不调用,类模板的成员函数是否不会被实例化
- 调用从不兼容类型强制转换的零数据结构的成员函数-未定义