什么是g ++用于识别'const'变量修改的底层机制?

时间:2018-04-27 19:49:28

标签: gcc compiler-construction g++

当我们将变量声明为const

const int cv  = 3;

我猜g ++在数据区域的某处(比如地址0xFF77)保留了4个字节。将来,当人们访问cv时,编译器会转到0xFF77以获得值3。

但是,编译器如何存储信息'const'? g ++必须以某种方式存储这些信息,所以当另一行试图修改cv时,编译器知道'哦,这不正确,因为我知道0xFF77是const'。

这里有人熟悉gcc编译器吗?你能给我一些见解吗?

由于

2 个答案:

答案 0 :(得分:0)

程序执行后,编译器不再存在。它的工作已经完成;程序已编译成可执行文件,然后可以在不安装编译器的情况下执行。 (因此,可以将可执行文件分发给没有编译器的计算机。)

但即使您的问题被重写以解决该问题,也存在一个无根据且不正确的假设:

  

g ++必须以某种方式存储此信息,因此当另一行尝试修改cv时,运行时知道'哦,这是不正确的,因为我知道0xFF77是const'

实际上,运行时没有义务阻止变量被修改。这是程序员的责任。当您将变量声明为const时,您通知编译器您不会修改其值,这可能允许编译器更好地进行优化。如果事实证明你确实修改了变量,那么这种优化可能会失败;修改声明为const的值的事实是“未定义的行为”。 (未定义的行为确实是未定义的。抛出错误将是定义的行为。)

在某些情况下,编译器实际上可以在编译期间检测到正在修改声明为const的变量。

const int cv = 3;
cv = 42;

如果他们看到公然违反合同,大多数编制者都会发出警告。但这是一个警告,而不是错误,有时候编译器被误导了。例如,假设函数always_false符合其名称,则以下代码不会产生错误:

const int cv = 3;
if (always_false(cv)) cv = 42;

简而言之,C ++不承诺将您从错误中解脱出来;如果你选择用C ++编写程序,你必须准备好确保遵守规则。

答案 1 :(得分:0)

  

但是,编译器如何存储信息' const'?

它没有。 const关键字是类型限定符。关于constness的这些知识在类型检查期间很重要,这是由编译器的前端执行的任务。

如果没有(无效)尝试修改const值 - 请注意复制和引用/指针语义之间的区别 - 找到,编译器的后端将发出代码。然后,有问题的数据放在一个目标文件中(不一定是只读部分),如ELF。

最终,您的操作系统将加载此类二进制文件。修改过一次" const对象",或者来自未被编译器的类型检查器或任何侵入机制捕获的违规表达式,可能会发生什么变化。