常量存储在内存中的什么位置?
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 不会出现在程序。如果编译器能够进一步减少表达式,一些常量可能会消失或合并。
在下面给出的代码中,我没有声明任何变量,这意味着我使用了 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 不会出现在程序。如果编译器能够进一步减少表达式,一些常量可能会消失或合并。
- 如果将