哪个内存用于全局定义的变量
Which memory is used for variables defined globally?
假设我们需要使用8MB堆栈,并且希望使用标准C++数组
是真的吗
const int MX = 10000;
int DP[MX][MX];
int main() {
printf("%likBn", (sizeof(DP))>>10);
}
使用堆内存,因此不segfault(与在main
中声明DP
时相反)?它与在main
中通过new
/malloc
分配内存(除了free
问题)不同吗?
在现代操作系统中,可执行文件使用的内存(通常)分为五个不同的部分:
-
代码部分(在Linux/Unix系统中也称为
text
,原因是歇斯底里的历史原因)。这就是您的功能"所在"。通常也用于常数值,如char *s = "Hello, World";
,"Hello,World!"部分存储在CODE部分中。 -
"Initialized"数据部分(也称为"data")-用于已给定值的全局(在C和C++术语中为静态)数据,例如
int x = 42;
-
未初始化数据,也称为BSS,块存储部分,用于未给定值的全局数据,因此初始化为零。全局上下文中的
int y;
或static int status;
将属于本节。
以上所有部分都在可执行文件中进行了定义。有些可执行文件的部分比这个多,但这些是"典型的"部分。"额外"部分的一个例子是"只读数据"部分,它可以用于存储例如字符串数据,而不是将其存储在"代码"部分中。
一旦加载了可执行文件,操作系统就会创建另外两个部分:
-
堆栈,用于在函数内部保存局部变量,也用于"返回"调用函数。堆栈的大小通常相当有限,但远没有过去那么小——如今,堆栈的大小经常在"几兆字节"的范围内。我使用的第一台机器有一个256字节的堆栈(这是硬编码的)。如果你想要更多,你必须通过制作自己的软件定义堆栈来安排。不太愉快!
-
一堆。这用于"动态分配",例如为大小随程序输入而变化的阵列创建存储时。在程序开始运行之前,堆的内容是未知的。在现代系统中,堆一开始的大小很小,并且可以增长(但当机器本身内存不足时,如果没有其他限制的话,也是有限制的——但通常这个限制可能低于系统配置的限制,以避免一个应用程序耗尽机器中的所有内存)。
在上面的示例中,DP
位于"未初始化数据"部分。
它将使用静态内存来存储DP
,基本上与new
/malloc()
的动态分配相同,无需管理内存。
它使用全局内存,而不是堆内存,并且在启动时由操作系统预先分配。由于它不是函数的局部,因此堆栈的大小无关紧要。
在C++中,用户内存分为三部分:堆、堆栈和静态(包括常量)。通常,全局变量位于静态部分。由于数组的内存是在定义时分配的,我相信它也在静态部分。此外,我找不到任何关于在堆中分配全局数组的文章。如果有人发现不是这样,请给我一个@。
- 在头文件中定义变量不会出错
- 如何使用 SFINAE 在方法调用中有条件地定义变量?
- 在命名空间中定义变量
- 是否可以在C++中基于程序集输出(.dll或.exe)定义变量
- 用不同类型重新定义变量
- 具有全局定义变量的递归比没有全局定义变量的递归函数获得更多的堆栈.为什么?(跳入C++)
- 定义变量类型
- 在命名空间中定义变量,但在测试中获取空值
- cmake没有定义变量
- C 中的继承:在亲子类中定义变量
- 在同一函数中定义变量及其静态等效项
- 如何在 Tensorflow C++ 中定义变量的自定义有状态 Op 保存值
- 如何将 int 和 int* 传递到函数中以定义变量
- 在定义变量时调用类函数
- 定义变量与模板
- 定义变量类型
- 为什么您可以在 switch 语句中的"默认"下定义变量,而不能在"case"下定义变量
- C 如何基于另一个变量和某些算术定义变量的值
- C 可以指向具有定义变量的函数
- C 定义变量设置值