存储分配给const变量

bru*_*ker 6 c++ storage const

我正在读一本提到这一点的书

如果编译器知道const的每次使用,则不需要分配空间来保存它.例如:

  1. const int c1=1;
  2. const int c3=my_f(3);
  3. extern const int c4;

鉴于c3和c4的值不称为编译时,必须为c3和c4分配存储.

我不明白这一点.我的怀疑是:

抱在这里意味着什么?难道它还不需要将所有内容存储在内存中吗?对于c1,我们不会有任何存储分配?

请清除我的疑虑.

谢谢.

das*_*ght 5

c1与其他两个常量的不同之处在于它是用文字值初始化的。这使得编译器可以在使用常量的任何地方放置该值,如下所示:

int x = z + c1;
Run Code Online (Sandbox Code Playgroud)

可以替换为

int x = z + 1;
Run Code Online (Sandbox Code Playgroud)

这意味着编译器不需要分配空间并1在其中存储。

c3c4是不同的:一个是使用函数计算的,另一个是由不同的编译单元提供的。这意味着编译器无法再像 那样执行替换:编译器不知道和c1的值。因此编译器生成代码c3c4

int x = z + c4;
Run Code Online (Sandbox Code Playgroud)

就像c4变量存储在内存中的某个位置一样。由于本例中c4是外部常量,因此链接器将解析其位置,并填写编译器缺少的信息(即 的地址c4)以使程序完整并准备运行。

  • @Leoheart编译器*允许*进行这种替换,并且大多数编译器都会这样做。但据我所知,编译器不必“内联”声明的常量:标准允许它们以任何一种方式执行。此外,您可以获取已声明常量的地址,在这种情况下,编译器除了在使用它的地方内联它之外,还将它放置在内存中。 (2认同)