2

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

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

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

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

4

4 回答 4

5

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

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

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

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

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

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

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

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

在上面的例子中,DP是在“未初始化的数据”部分。

于 2013-07-09T09:51:46.983 回答
1

它将使用静态内存进行存储DP,与使用/动态分配基本相同,无需管理内存。newmalloc()

于 2013-07-09T09:27:50.363 回答
1

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

于 2013-07-09T09:27:53.770 回答
0

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

于 2013-07-09T09:41:25.750 回答