const变量是否放在只读内存中?

Ole*_*siy 19 c c++ const

或者是否有一些其他保护措施不能修改它们?

如果它们在只读存储器中是有意义的 - 这就是制作它们的原因const,对吗?

Ton*_*ion 16

const是一个编译时构造,在运行时不知道.它只是帮助程序员理解他的程序,并通过改变不应该改变的东西来防止错误的引入. const告诉编译器您不希望允许更改此变量,因此编译器将强制执行它.

  • 通过"编译器将强制执行它",我认为你的意思是你希望编译器在源代码试图通过const限定类型修改对象时发出诊断,而不是编译器会阻止你转换const限定类型(或指向此类的指针)到非const限定类型(或指向此类的指针)并通过非const类型修改对象,前提是C++标准允许这样的修改(在某些情况下是这样)? (2认同)

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)

它将输出4221,但它也可能会崩溃.

现在看到这个:

#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)

在我的编译器上,这个输出4242,因为编译器做了一些优化.请注意,它仍然会因为*ptr = 21;


Mat*_*son 6

在很多情况下,编译器无法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,因此它无法初始化ab在编译时.

  • 根据我的经验,[当这些对象可以静态初始化时,大多数编译器会将“const”对象放入只读内存中。](http://coliru.stacked-crooked.com/view?id=5f641e5bea30e9974590f0a02b4e4907-c944ac6b0eed3bfc48b1f78a894f6965) (2认同)