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

P M*_*cki 2 c++ memory-management

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

const int MX = 10000;
int DP[MX][MX];

int main() {
  printf("%likB\n", (sizeof(DP))>>10);
}
Run Code Online (Sandbox Code Playgroud)

使用堆内存,因此不会出现段错误(与DP声明时相反main)?它是经由内存分配不同的new/ mallocmain(除了free问题)?

Mat*_*son 5

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

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

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

  • 未初始化的数据,也称为BSS,块存储部分 - 用于未给定值的全局数据,因此初始化为零.int y;在全球范围内,或static int status;将属于本节.

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

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

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

  • 一堆.这用于"动态分配" - 例如,为根据程序输入大小不同的阵列创建存储时.在程序开始运行之前,不知道堆的内容.在现代系统中,堆以较小的大小开始,并且允许增长(但是当机器本身耗尽内存时,如果没有别的话,则存在限制 - 但通常限制可能低于系统配置的限制,以避免一个应用程序耗尽机器中的所有内存).

在上面的例子中,DP是在"未初始化的数据"部分.