假设我们需要使用8MB堆栈,并希望使用标准C ++阵列 这是真的吗,
const int MX = 10000;
int DP[MX][MX];
int main() {
printf("%likB\n", (sizeof(DP))>>10);
}
使用堆内存,因此不会出现段错误(与在DP
中声明main
时相反)?它与通过new
中的malloc
/ main
分配内存(除了free
问题)不同吗?
答案 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)。 通常,全局变量位于静态部分中。由于数组的内存是在定义时分配的,我相信它也在静态部分。 此外,我找不到任何关于在堆中分配全局数组的文章。如果有人发现,请给我一个@。