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

jjjwad0x  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(224)

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

#include <stdio.h>

//Compiler version gcc  6.3.0

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

30byixjq1#

常量存储在不同的位置:

  • 常数可以被存储在存储器的被标记为对程序只读的指定部分中。
  • 在通用系统中,这不是ROM。ROM是物理只读存储器。ROM通常用于特殊用途的系统,在这种系统中,软件在制造硬件之前就已设置好(或至少在制造ROM设备之前)。通用系统使用RAM来存储程序的只读部分。它是可写的,因此操作系统可以装入程序及其数据。装入程序后,操作系统配置用于防止程序修改RAM的硬件特征的设置。
  • 各种类型的常数可以被存储在一起,混合字符串和数字以及其他信息,或者它们可以通过各种特征来组织,诸如将所有8字节常数存储在一个部分中而将4字节常数存储在另一部分中,以使得管理对齐和填充更容易或更有效。如果您在一个源文件中使用了数字921,123,537,并且还在另一个源文件中使用了数字921,123,537,我们通常希望内存只用于一次,除非语言语义禁止这样做。
  • 常量可以作为立即操作数内置到指令中。在许多体系结构中,指令可以包括用指令编码的短文字值。因此,指令可以说“将5加到寄存器4”。
  • 通常可以将常数合并到程序中。
  • 如果你把x乘以2,编译器可能会生成一条指令,把x加到它自己身上,所以数字2永远不会出现在生成的代码中。
  • 编译器可能会重写一个表达式,计算它的一部分或用不同的方式表达它。通常,你应该期望从常量构建的表达式,如3*4+5,在编译时被求值,结果17出现在程序的某个地方,而数字3、4和5将不会出现在程序中。如果编译器能够进一步简化表达式,一些常数可能消失或合并。

相关问题