假设我们需要使用 8MB 堆栈,并希望使用标准 C++ 数组。
是真的吗,那
const int MX = 10000;
int DP[MX][MX];
int main() {
printf("%likB\n", (sizeof(DP))>>10);
}
使用堆内存,因此不会出现段错误(与在DP
中声明的时间相反main
)?它与通过new
/ malloc
in分配内存有什么不同main
(除了free
问题)?
假设我们需要使用 8MB 堆栈,并希望使用标准 C++ 数组。
是真的吗,那
const int MX = 10000;
int DP[MX][MX];
int main() {
printf("%likB\n", (sizeof(DP))>>10);
}
使用堆内存,因此不会出现段错误(与在DP
中声明的时间相反main
)?它与通过new
/ malloc
in分配内存有什么不同main
(除了free
问题)?
在现代操作系统中,可执行文件使用的内存被分成(通常)五个不同的部分:
代码部分(由于歇斯底里的历史原因,text
在 Linux/Unix 系统中也称为)。这是您的功能“生活”的地方。通常也用于常量值,例如“Hello, World!” 部分存储在代码部分。char *s = "Hello, World";
“初始化”数据部分(也称为“数据”) - 用于已被赋予值的全局(在 C 和 C++ 术语中为静态的)数据,例如int x = 42;
未初始化数据,也称为 BSS,块存储部分 - 用于未给定值的全局数据,因此初始化为零。int y;
在全球范围内,或static int status;
将属于本节。
上述所有部分都在可执行文件中定义。一些可执行文件有比这更多的部分,但这些是“典型”部分。“额外”部分的一个示例是“只读数据”部分,它可用于存储例如字符串数据,而不是将其存储在“代码”部分中。
加载可执行文件后,操作系统会创建另外两个部分:
堆栈,用于保存函数内部的局部变量,也用于“返回”到调用函数。堆栈的大小通常相当有限,但远没有以前那么小——如今,堆栈通常在“几兆字节”的大小范围内。我使用的第一台机器有一个 256 字节的堆栈(并且是硬编码的)。如果您想要更多,您必须通过制作自己的软件定义堆栈来安排。不是很愉快!
一堆。这用于“动态分配” - 例如,在为大小取决于程序输入的数组创建存储时。在程序开始运行之前,堆的内容是未知的。在现代系统中,堆以较小的大小开始,并且允许增长(但是当机器本身内存不足时,如果没有其他限制,则存在限制 - 但通常该限制可能低于系统配置的限制,以避免一个应用程序用尽机器中的所有内存)。
在上面的例子中,DP
是在“未初始化的数据”部分。
它将使用静态内存进行存储DP
,与使用/动态分配基本相同,无需管理内存。new
malloc()
它使用全局内存,而不是堆内存,并且在操作系统启动时预先分配。由于它不是函数本地的,因此堆栈的大小无关紧要。
在 C++ 中,用户内存分为三个部分:堆、堆栈和静态(包括 const)。通常,全局变量位于静态部分。由于数组的内存是在定义时分配的,我相信它也在静态部分。此外,我找不到任何关于在堆中分配全局数组的文章。如果有人发现它,请给我一个@。