在C++中使用const
时,是什么让你无法在机器的低层隐式传递一个非const的值?机器如何确定这是const
?什么使const在机器的较低级别?
(除了一个事实,即const
意味着这意味着什么...)
是它可能存储在内存.rdata部分还是有时设置,使得它常量位或这是如何工作的?
任何人都可以澄清?
在C++中使用const
时,是什么让你无法在机器的低层隐式传递一个非const的值?机器如何确定这是const
?什么使const在机器的较低级别?
(除了一个事实,即const
意味着这意味着什么...)
是它可能存储在内存.rdata部分还是有时设置,使得它常量位或这是如何工作的?
任何人都可以澄清?
const
主要是一个编译时的事情;它并不意味着它们可能在运行时存储在何处,或者它们是否可能在运行时受到保护。
在实践中,编译器可以选择把常数在可执行文件,它可以由存储器管理单元写保护的程序部分(如果存在)。或者,编译器可以将常量直接折叠到代码中,以使它们甚至不存在作为可寻址位置。
或者,它可能不会做任何这些事情。
const
-ness几乎总是由编译器,仅此而已,无所不及执行。根本没有机器保护。
编辑:@Oli查尔斯沃斯的答案比我的好。
值得一提的是,智能编译器在优化阶段也可以使用这些信息。 – 2010-10-28 11:07:20
在C++中,const
,很少有什么做硬件。这主要是告诉编译器某种访问会导致编译器错误的一种方法。
唯一的例外是基本或POD类型的静态常量变量,它们通常链接到可执行映像中的只读部分,如果抛弃常量并尝试去执行,会触发某种页面错误修改其中之一。
“const”并不一定意味着存储是只读的。它是一个声明,C++程序不会改变它(因此编译器应该拒绝任何尝试)。这并不意味着价值不会改变。
这是相当合理的一个变量是“const volatile的”(该计划不会改变它,但它可能在任何时候改变)。例如,只读硬件端口可能就是这样一个野兽。
所以在“较低级别的机器”,没有什么需要做的事情。内存是什么,应用程序员需要正确声明内容。
大多数情况下,什么都没有。 – 2010-10-28 11:01:13