在您的示例中,许多场景基于您的编译器的优化级别。
放置在“代码存储器”中的常量
在下面的代码中:
int a =10, b=20;
int c = a+b;
return 0;
变量a 和b 是常量,它们不会改变。编译器可以对此进行优化并将它们优化为:
诠释 c = 10 + 20;
所以值 10 和 20 可以放入代码内存中,消除变量 a 和 b。
注册不是内存
允许编译器将变量a 和b 分配给寄存器。寄存器位于处理器内,因此不占用任何 RAM 或内存空间。寄存器也不属于代码空间。
(这可能是因为没有语句需要a 或b 的地址)。
删除所有代码
在更高的优化设置下,编译器可以删除所有代码并替换为return 0。
变量a 和b 没有改变。
变量 c 已更改,但未被任何其他语句使用。
您的程序没有任何效果(没有打印任何内容,没有像写入硬件这样的外部操作)。
因此您的程序可以缩减为return 0;。
代码存储器与数据存储器
一般来说,处理器指令放置在一个称为“代码内存”的段中。这实际上可能驻留在 RAM 中,而不是 Flash 或 ROM 中。例如,在 PC 上,您的代码可以从硬盘驱动器加载到 RAM 中并在 RAM 中执行。与 Flash 类似,您的代码可以从 Flash 加载到 RAM 中并在 RAM 中执行。
常量和数字一样,可以放在只读段或代码段中。许多处理器可以从代码段加载常量(参见 ARM 和 Intel 汇编指令)。只读段可以存在于只读设备(ROM 或闪存)上,也可以存在于 RAM(或硬盘等设备上)。您可以保证,代码不会写入只读段。
数据存储器不同。 C++ 语言至少有 3 个“数据”内存区域(变量所在的位置): 1)本地(也称为堆栈),短生命周期变量所在的位置; 2) 动态内存(又名堆),使用 new 或 malloc 和 3) 自动/全局变量分配。这些内存区域可以放置在任何地方,只要内存具有读取和能力。它们不需要很快,只需要读写(例如,硬盘可以用作数据存储器)。
内存组织比拥有代码、堆栈和堆更复杂。在嵌入式系统世界中,内存可以放置在非标准位置,可能需要有更详细的内存段,以便它们可以放置在不同的区域。例如,嵌入式系统可能希望将常量放入 Flash 中,以便可以轻松更改它们(即使在代码段中可以更有效地访问它们)。一些代码可能希望被放入处理器的引导区(由处理器制造商编程)。一些嵌入式系统可能具有非易失性内存(例如电池供电的内存),其行为类似于只读内存。
相信你的编译器
相信您的编译器会尽可能将代码、数据和变量放在最高效的区域。您的编译器了解您的平台,并会为您做出最佳决策。如果您需要更改编译器的设置,可以,但您应该真正知道自己在做什么以及为什么需要更改它们。大多数 PC 平台将代码从硬盘驱动器(或 SSD)加载到 RAM 并从 RAM 执行代码。嵌入式系统是不同的,并且取决于硬件设备。代码可以从闪存运行,因为平台的 RAM 最少。有些可能会将压缩的代码存储在串行访问只读设备中,并且必须在执行前解压缩到 RAM 中。在这些情况下,编译器针对这些特化进行了配置。所以,相信你的编译器,让它把代码和数据放到正确的段和位置。