'const'关键字如何工作?

时间:2018-08-15 15:10:06

标签: c++ const

使用const int x = 5; x = 6; //not allowed! 可防止更改变量。很简单。

const

但是这实际上是如何实现的?

这只是一个编译器规则吗?还是在机器代码级别上发生了区分const和非const变量的事情?

edit:我的问题与this不同,因为该问题仅询问编译器如何跟踪GenerationType.IDENTITY是什么,什么不是。我的问题不是这个。我的问题是有关const的实际机器代码级含义的(如果有的话)(似乎它可能只是编译器提示)。无论如何,只要看看我的问题的答案和链接的问题的答案是不同的即可。这应该给你一个提示,即这不是重复的。

edit:关于访问派生类中成员的“重复”问题不是重复的。不同的问题,不同的答案。

3 个答案:

答案 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;

相关问题