使用const int x = 5;
x = 6; //not allowed!
可防止更改变量。很简单。
const
但是这实际上是如何实现的?
这只是一个编译器规则吗?还是在机器代码级别上发生了区分const和非const变量的事情?
edit:我的问题与this不同,因为该问题仅询问编译器如何跟踪GenerationType.IDENTITY
是什么,什么不是。我的问题不是这个。我的问题是有关const的实际机器代码级含义的(如果有的话)(似乎它可能只是编译器提示)。无论如何,只要看看我的问题的答案和链接的问题的答案是不同的即可。这应该给你一个提示,即这不是重复的。
edit:关于访问派生类中成员的“重复”问题不是重复的。不同的问题,不同的答案。
答案 0 :(得分:4)
如果检测到const
违例,编译器将检查代码的语义,并且不会编译。不会进行任何运行时分析。
在这种情况下,编译器具有一定的自由度。请参阅this帖子。编译器可以完全优化该变量。 https://godbolt.org/g/GDJ6AM
答案 1 :(得分:3)
但是这实际上是如何实现的?
语言规范将其留给实现者酌情决定,只要编译器确保程序源代码不会违反由此强制实施的不变性语义(即,分配给const对象会产生编译错误并丢弃) const说明符会产生实现定义的行为。
该标准不需要运行时检查。但是,如果实现可以执行/强制执行运行时检查,则拥有它们是完全合法的。
例如,可以将全局/静态范围const值放置在只读存储区中,例如微控制器中的ROM,或在具有虚拟内存的OS中以只读方式映射的页面。大多数可执行文件格式为只读数据(如ELF中的.rodata
)指定了一个特殊部分,该部分将以只读方式映射,并且尝试修改该内存区域中的内容将被操作系统和结果捕获。在程序异常中。
答案 2 :(得分:1)
它是纯粹基于编译器的。我可以记得几种类型的consts
const int x = 5
创建一个不可更改的整数
const int DoThing();
返回一个常量整数
void MyClass::GetSomething() const;
确保函数GetSomething不会更改其类的任何成员数据
int const *
创建一个指向常规int的指针。 int的值可以更改,但指针不能更改。
如果你想凝视魔鬼的眼睛
const int const * MyClass:DoThing(const char * const) const;