当您在 Windows 上运行程序时,它会加载到计算机内存中,组织如下:
数据段可能包含只读或具有读写访问权限的数据。
例如:
char *c = "Hello World";
字符串
Hello World
据说存储在内存的只读部分。它是存储在物理内存(有时称为 RAM)中还是存储在只读的 ROM 中?只读的话怎么写呢?
一台 PC 只有一个内存区域真正符合 ROM 的要求,那就是存储 BIOS 的地方。所有 Windows 和 Windows 中加载的程序都将位于 RAM 中。
x86 处理器内存管理能够将内存块标记为只读,但链接器和操作系统必须协同工作才能实现这一点。它发生在程序加载到内存后。
它存储在RAM中。操作系统与处理器本身合作,能够保护内存区域,以便任何从用户代码写入这些区域的尝试都会导致异常。
在许多嵌入式系统中,它们具有 RAM 和某种类型的只读存储器,通常称为闪存(可以多次编程,而无需从印刷电路板上移除)。
简单的嵌入式应用程序将可执行和只读数据部分放置在闪存中并在闪存外执行。读/写变量被放入 RAM 中。让我们为您的示例代码片段考虑这个模型:
char * c = "Hello World!";
在上面的语句中,变量
c
存在于RAM中,因为变量的默认设置是读写访问。如果您指定变量是常量,它将存在于 ROM 中{实际上,它将代表 ROM 中的一个位置。}:
char * const c = "Hello World!"; // A constant pointer that lives in ROM.
编译器将文字文本
"Hello World!"
处理得更复杂一些。实际文本存在于 ROM 中,要么在可执行区域,要么在数据区域;取决于译者。许多编译器会在 RAM 中分配内存并将文字复制到 RAM 中,并使变量 c
指向 RAM 中的副本。这是因为文字没有指定为常量。
为了避免将文字复制到 RAM 中,请声明指向常量数据的变量:
const char * c = "Hello World"; // A pointer to constant data.
上面的定义仍然允许指针在执行过程中指向不同的东西。如果您想在整个程序中引用文本文字的一个实例,请声明一个指向常量数据的常量指针:
const * char * const c = "Hello World!"; // A constant pointer to constant data
该技术允许可执行文件加载到 RAM 中(以加快执行速度),并且仍然可以从 ROM 访问只读数据(这可以释放 SRAM 以用于真正的读/写变量)。
在大多数 PC 上,所有内容都存储在非易失性内存(硬盘、BIOS 等)或 RAM 中。常见的方法是从ROM(包括硬盘)加载程序并在RAM中执行。当将可执行文件加载到 RAM 时,操作系统通常也会将只读数据加载到 RAM 中。只读数据可能受到操作系统的保护,因此当应用程序写入该区域时会生成异常。
它存储在RAM中。
用字符串初始化的字符指针(如您的示例中所示)是只读的。 您可以强制转换 const 变量,以便可以“写入”它,但程序的行为将无法预测。
RAM 的只读区域受操作系统保护。
这可能会根据您使用的系统类型而有所不同。上面的答案适用于您的标准 PC。嵌入式系统实际上可能会将常量数据写入某种非易失性存储器。
如果有帮助,请考虑有两种不同的方式可以使内存只读。
当您谈论程序值的只读存储器时,您通常谈论的是第二种类型。这些值在程序启动时被初始化,然后操作系统不允许修改它们。
注意: 以上是极其简单的解释,但确实给出了总体思路。
它存储在 RAM 内存中。 ]:>