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

时间:2013-07-09 09:24:36

标签: c++ memory-management

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

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

int main() {
  printf("%likB\n", (sizeof(DP))>>10);
}

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

4 个答案:

答案 0 :(得分:5)

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

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

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

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

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

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

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

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

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

答案 1 :(得分:1)

它将使用static memory来存储DP基本上与使用new / malloc()动态分配相同,而不需要管理记忆。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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