什么使const在机器的较低级别?

时间:2010-10-28 10:58:53

标签: c++ constants

在C ++中创建const时,是什么让你不能在机器的较低层隐含地传递一个非const?如何通过机器确定这是const

(除了const意味着它意味着......)

它是否可能存储在内存的.rdata部分中,或者是否有一些设置使其成为常量或者它是如何工作的?

任何人都可以澄清吗?

4 个答案:

答案 0 :(得分:12)

const主要是编译时的事情;它并不意味着它们可能在运行时存储的位置,或它们是否可能在运行时受到保护。

实际上,编译器可以选择将常量放在可执行文件的程序部分中,该部分可以由内存管理单元(如果存在)进行写保护。或者,编译器可以将常量直接折叠到代码中,这样它们甚至不会作为可寻址位置存在。

或者,它可能不会做这些事情。

答案 1 :(得分:8)

const - ness几乎总是由编译器强制执行,仅此而已。完全没有机器保护。

编辑:@Oli Charlesworth的答案比我的好。

答案 2 :(得分:3)

“const”并不一定意味着存储是只读的。这是一个C ++程序不会改变它的声明(因此编译器应该拒绝任何尝试这样做)。这并不意味着价值不会改变。

变量“const volatile”是非常合理的(程序不会改变它,但它可能随时改变)。例如,只读硬件端口可能就是这样的野兽。

因此,在“机器的较低级别”,不需要做任何事情。内存就是这样,应用程序员需要正确地声明内容。

答案 3 :(得分:1)

在C ++中,const很少与硬件有关。它主要是一种告诉编译器某些类型的访问应该导致编译器错误的方法。

唯一的例外是原始或POD类型的静态const变量,它们通常链接到可执行映像中的只读部分,如果丢弃常量并尝试修改,将触发某种页面错误其中之一。