Ton*_*ion 16
const是一个编译时构造,在运行时不知道.它只是帮助程序员理解他的程序,并通过改变不应该改变的东西来防止错误的引入. const告诉编译器您不希望允许更改此变量,因此编译器将强制执行它.
Xaq*_*aqq 12
不,他们不是必须的.const是编译时,允许编译器执行某种优化.但是,并非必须将变量放入只读存储器位置.
请参阅此示例,这是未定义的行为(感谢Dyp指出这一点):
#include <iostream>
int main()
{
const int bla = 42;
int *ptr = const_cast<int *>(&bla);
std::cout << *ptr << std::endl;
*ptr = 21;
std::cout << *ptr << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
它将输出42和21,但它也可能会崩溃.
现在看到这个:
#include <iostream>
int main()
{
const int bla = 42;
int *ptr = const_cast<int *>(&bla);
std::cout << bla << std::endl;
*ptr = 21;
std::cout << bla << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
在我的编译器上,这个输出42和42,因为编译器做了一些优化.请注意,它仍然会因为*ptr = 21;
在很多情况下,编译器无法const进入只读存储器(假设系统中首先存在只读存储器).实际上,我相信几乎所有编译器通常都会将const对象放在常规数据(或堆栈)内存中,就像普通变量一样.
主要目的const是使用您不想要的编译器声明您的意图,并且不应该更改某些值.我没有看到为什么编译器在有限的情况下不能将const变量放在只读内存中的原因.但我也不会依赖于此 - 标准肯定会使这成为可能,因为它提到使用从最初标记的对象中const_cast删除,然后写入它是未定义的行为(因此,它不需要编译器允许在使用之后修改值以删除原始值- 因此允许"崩溃,因为我们试图写入只读内存").constconstconst_castconst
但考虑一下:
class X
{
int x;
public:
X(int v) : x(v) {}
}
int c = rand();
const X a(c+1);
const X b(c+2);
Run Code Online (Sandbox Code Playgroud)
在这种情况下,编译器无法知道c它来自的值rand,因此它无法初始化a并b在编译时.