【问题标题】:What is stored in Code memory and Data memory代码存储器和数据存储器中存储的内容
【发布时间】:2020-12-12 09:27:16
【问题描述】:

谁能解释一下代码和数据内存之间的区别。我知道代码存储在闪存中,数据存储在 RAM 中,但我很困惑。

#include <iostream>
using namespace std;

int main()
{
    int a =10, b=20;
    int c = a+b;
    return 0;
}

这里 a,b,c 存储在数据存储器 (RAM) 中,但代码存储器中存储的是什么?整个代码是否存储在代码内存中?如果是,那么这是否意味着我们将 a、b、c 存储在数据和代码内存中。

【问题讨论】:

  • 代码不一定存储在闪存中,它可以存储在内存中。在 windows 或 linux 等上运行的程序中的代码在 ram 中而不是 flash 中。

标签: c++ memory-management heap-memory ram flash-memory


【解决方案1】:

在您的示例中,许多场景基于您的编译器的优化级别。

放置在“代码存储器”中的常量

在下面的代码中:

int a =10, b=20;
int c = a+b;
return 0;

变量ab 是常量,它们不会改变。编译器可以对此进行优化并将它们优化为: 诠释 c = 10 + 20; 所以值 10 和 20 可以放入代码内存中,消除变量 ab

注册不是内存

允许编译器将变量ab 分配给寄存器。寄存器位于处理器内,因此不占用任何 RAM 或内存空间。寄存器也不属于代码空间。 (这可能是因为没有语句需要ab 的地址)

删除所有代码

在更高的优化设置下,编译器可以删除所有代码并替换为return 0
变量ab 没有改变。
变量 c 已更改,但未被任何其他语句使用。
您的程序没有任何效果(没有打印任何内容,没有像写入硬件这样的外部操作)。
因此您的程序可以缩减为return 0;

代码存储器与数据存储器

一般来说,处理器指令放置在一个称为“代码内存”的段中。这实际上可能驻留在 RAM 中,而不是 Flash 或 ROM 中。例如,在 PC 上,您的代码可以从硬盘驱动器加载到 RAM 中并在 RAM 中执行。与 Flash 类似,您的代码可以从 Flash 加载到 RAM 中并在 RAM 中执行。

常量和数字一样,可以放在只读段或代码段中。许多处理器可以从代码段加载常量(参见 ARM 和 Intel 汇编指令)。只读段可以存在于只读设备(ROM 或闪存)上,也可以存在于 RAM(或硬盘等设备上)。您可以保证,代码不会写入只读段。

数据存储器不同。 C++ 语言至少有 3 个“数据”内存区域(变量所在的位置): 1)本地(也称为堆栈),短生命周期变量所在的位置; 2) 动态内存(又名堆),使用 newmalloc 和 3) 自动/全局变量分配。这些内存区域可以放置在任何地方,只要内存具有读取能力。它们不需要很快,只需要读写(例如,硬盘可以用作数据存储器)。

内存组织比拥有代码、堆栈和堆更复杂。在嵌入式系统世界中,内存可以放置在非标准位置,可能需要有更详细的内存段,以便它们可以放置在不同的区域。例如,嵌入式系统可能希望将常量放入 Flash 中,以便可以轻松更改它们(即使在代码段中可以更有效地访问它们)。一些代码可能希望被放入处理器的引导区(由处理器制造商编程)。一些嵌入式系统可能具有非易失性内存(例如电池供电的内存),其行为类似于只读内存。

相信你的编译器

相信您的编译器会尽可能将代码、数据和变量放在最高效的区域。您的编译器了解您的平台,并会为您做出最佳决策。如果您需要更改编译器的设置,可以,但您应该真正知道自己在做什么以及为什么需要更改它们。大多数 PC 平台将代码从硬盘驱动器(或 SSD)加载到 RAM 并从 RAM 执行代码。嵌入式系统是不同的,并且取决于硬件设备。代码可以从闪存运行,因为平台的 RAM 最少。有些可能会将压缩的代码存储在串行访问只读设备中,并且必须在执行前解压缩到 RAM 中。在这些情况下,编译器针对这些特化进行了配置。所以,相信你的编译器,让它把代码和数据放到正确的段和位置。

【讨论】:

    【解决方案2】:

    快速过度简化:

    代码内存存储从您的 C++ 代码(ROM)编译的机器语言指令序列。

    由程序创建和操作的实际数据改为存储在RAM中,可以理解为由stackheap组成>:数据存储在较慢但较大的堆中,而其地址由堆栈中的指针保留。堆栈托管在更快的内存寄存器中。

    堆栈中的指针在 ROM 中的当前指令行告知时检索堆中的数据,或者在需要时更一般地检索数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-02
      • 1970-01-01
      • 1970-01-01
      • 2013-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多