常量存储在内存中的什么位置?

Where constants are stored in memory?

在下面给出的代码中,我没有声明任何变量,这意味着我使用了 0 个字节,或者像字符串文字一样在 ROM 中声明了常量。

#include <stdio.h>

//Compiler version gcc  6.3.0

int main()
{
  printf("%d",2*5);
  return 0;
}

常量存储在不同的地方:

  • 常量可以存储在对程序标记为只读的指定内存部分。
    • 在通用系统中,这不是 ROM。 ROM 在物理上是只读存储器。 ROM 通常用于专用系统,在这种系统中,软件是在制造硬件之前(或至少在制造 ROM 设备之前)设置的。通用系统将 RAM 用于程序的只读部分。它是可写的,因此操作系统可以加载程序及其数据。加载程序后,操作系统配置硬件功能设置,防止程序修改 RAM。
    • 各种常量可以存储在一起,混合字符串和数字等信息,也可以按各种特性组织,例如将所有八字节常量存储在一个部分,将四字节常量存储在另一部分,使管理对齐和填充更容易或更有效。此外,一些常量可能是共享的;如果您在一个源文件和另一个源文件中都使用了数字 921,123,537,我们通常希望内存只用于一次,除非语言语义排除它。
  • 常量可以作为直接操作数内置到指令中。在许多体系结构中,指令可以包括用指令编码的短文字值。所以一条指令可能会说“将 5 添加到寄存器 4”。
  • 常量通常可以合并到程序中。
    • 如果将 x 乘以 2,编译器可能会生成一条将 x 添加到自身的指令。所以数字 2 永远不会出现在生成的代码中。
    • 编译器可能会重写一个表达式,计算它的一部分或以不同的方式表达它。通常,您应该期望从常量构建的表达式(例如 3*4+5)在编译时求值,结果 25 在程序的某处,而数字 3、4 和 5 不会出现在程序。如果编译器能够进一步减少表达式,一些常量可能会消失或合并。