gpt4 book ai didi

arrays - 数组声明 : Global Vs Local

转载 作者:行者123 更新时间:2023-12-02 08:26:29 24 4
gpt4 key购买 nike

为什么我们不能在 main 函数内或任何函数内局部地声明一个 10000000 个整数(或者说,足够大)的数组,而它可以在全局范围内声明?

最佳答案

tl;dr:局部变量的空间是有限的。这就是 CPU 和操作系统的工作方式。


这是许多语言和实现共享的实现细节,例如典型桌面操作系统上的 C、C++。

大多数运行代码的平台都预留了一些称为堆栈的内存,用于返回地址和本地存储。这只是 CPU(Intel、AMD 等)如何执行机器码的细节。

从堆栈分配非常快,但内存只在函数调用返回之前有效。这使它成为 C/C++ 局部变量的理想选择。

然而,栈空间是有限的,所以一个大的分配会失败Stack Overflow - 即使“其他地方”仍有足够的内存。

全局变量的内存是在程序启动时分配的。例如。可执行文件将指示“我需要这么多空间填充零,我需要这么多空间用于数据,以及这么多空间用于代码。”

“第三个”内存位置是:它用于使用malloc/new 等分配的内存。在堆上分配比在堆栈上更昂贵(并且有更多的问题需要处理),并且它们会一直存在直到你释放它们,这既是好事也是一种负担。


一些旁注,有意省略,因为它与问题没有直接关系:

堆栈只是一个(连续的)内存范围,您只能从顶部分配和释放内存。这使得它具有局限性,方便快捷。

在现代桌面系统上,32 位进程通常不再耗尽内存,而是耗尽地址空间:仍然有可用的物理内存,但 32 位字中所有可用的可能地址都用完了。

每个执行线程都有自己的堆栈,而全局变量和堆在进程的所有线程之间共享。


为什么编译器不将大量分配移动到别处?

首先,“一直都是这样”。许多现有代码可能微妙地依赖于旧行为,并且“改进”编译器可能会破坏此代码。

其次,由于种种原因,唯一普遍适用的“别处”是堆。堆栈和堆分配之间的性能差异是显着的:

  • 堆分配更昂贵
  • 堆是共享的,因此必须同步从多个线程访问堆,这可能会非常昂贵。
  • 栈顶几乎总是在 CPU 的缓存中(因为该地址范围的访问非常频繁)。堆很可能不是

大多数时候,这些细节并不重要,但对于某些操作,这种差异很重要。如果编译器决定在堆上进行一些分配,我们就会失去可预测性。

关于arrays - 数组声明 : Global Vs Local,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31750293/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com