哪个内存用于全局定义的变量

Which memory is used for variables defined globally?

本文关键字:定义 变量 全局 用于 内存      更新时间:2023-10-16

假设我们需要使用8MB堆栈,并且希望使用标准C++数组
是真的吗

const int MX = 10000;
int DP[MX][MX];
int main() {
  printf("%likBn", (sizeof(DP))>>10);
}

使用堆内存,因此不segfault(与在main中声明DP时相反)?它与在main中通过new/malloc分配内存(除了free问题)不同吗?

在现代操作系统中,可执行文件使用的内存(通常)分为五个不同的部分:

  • 代码部分(在Linux/Unix系统中也称为text,原因是歇斯底里的历史原因)。这就是您的功能"所在"。通常也用于常数值,如char *s = "Hello, World";,"Hello,World!"部分存储在CODE部分中。

  • "Initialized"数据部分(也称为"data")-用于已给定值的全局(在C和C++术语中为静态)数据,例如int x = 42;

  • 未初始化数据,也称为BSS,块存储部分,用于未给定值的全局数据,因此初始化为零。全局上下文中的int y;static int status;将属于本节。

以上所有部分都在可执行文件中进行了定义。有些可执行文件的部分比这个多,但这些是"典型的"部分。"额外"部分的一个例子是"只读数据"部分,它可以用于存储例如字符串数据,而不是将其存储在"代码"部分中。

一旦加载了可执行文件,操作系统就会创建另外两个部分:

  • 堆栈,用于在函数内部保存局部变量,也用于"返回"调用函数。堆栈的大小通常相当有限,但远没有过去那么小——如今,堆栈的大小经常在"几兆字节"的范围内。我使用的第一台机器有一个256字节的堆栈(这是硬编码的)。如果你想要更多,你必须通过制作自己的软件定义堆栈来安排。不太愉快!

  • 一堆。这用于"动态分配",例如为大小随程序输入而变化的阵列创建存储时。在程序开始运行之前,堆的内容是未知的。在现代系统中,堆一开始的大小很小,并且可以增长(但当机器本身内存不足时,如果没有其他限制的话,也是有限制的——但通常这个限制可能低于系统配置的限制,以避免一个应用程序耗尽机器中的所有内存)。

在上面的示例中,DP位于"未初始化数据"部分。

它将使用静态内存来存储DP,基本上与new/malloc()的动态分配相同,无需管理内存。

它使用全局内存,而不是堆内存,并且在启动时由操作系统预先分配。由于它不是函数的局部,因此堆栈的大小无关紧要。

在C++中,用户内存分为三部分:堆、堆栈和静态(包括常量)。通常,全局变量位于静态部分。由于数组的内存是在定义时分配的,我相信它也在静态部分。此外,我找不到任何关于在堆中分配全局数组的文章。如果有人发现不是这样,请给我一个@。