局部数组变量 exc 糟糕的访问分段 & 局部还是全局?

local array variable exc bad acces segmentation & local or global?

本文关键字:局部 全局 分段 变量 数组 exc 访问      更新时间:2023-10-16

你好,我已经看到了这个最大的局部数组变量的大小,但我想知道为什么这是ok的,如果数组被设置为全局,而不是ok,如果它出现在main之后。

还有一个相关的问题:拥有在a.p中定义并在a.hpp中使用extern声明的大内存对象是一种好做法吗?或者更好地使用在本地函数中定义的大内存,但定义为vector或new或malloc,并将它们传递给函数参数。

这是我的经验,这些问题是我必须解决的…

Thank You

#include <iostream>
using namespace std;
#define N (10000000000000)
int sd[N];
int main() {
  // int sd[N];
  return 0;
}

在全局范围内声明:

int sd[N];
int main() {
  return 0;
}

生成的二进制会变得非常大。当进程被加载到内存中时,整个全局内存数据集被映射到。

在函数中声明:

int main() {
  int sd[N];
  return 0;
}

并且在函数被调用时立即分配内存——它是从堆栈中分配的。线程的堆栈内存通常初始化较低,接近1兆字节或更少。一旦堆栈内存耗尽,游戏就结束了。

正如其他人在评论中指出的那样,分配LARGE数组的正确方法是动态地使用堆内存,而堆内存通常是充足的。

int main() {
  int* sd = new int[N];
  ...
  delete [] sd; // free the allocated memory
  return 0;
}

更好,这样你就不需要记住delete:

int main() {
  std::vector<int> sd(N);
  ...
}