【问题标题】:C++ large array of vectorsC++ 大型向量数组
【发布时间】:2018-04-02 18:53:16
【问题描述】:

我在使用 C++ 中的大量向量时遇到了一些问题。 基本上我不想要一个包含 200 万个元素的数组,每个元素都是一个 vector<int>(用于构建邻接列表)。

所以当我执行vector<int> myList[10] 时效果很好,但是当我执行vector<int> myList[2000000] 时它不起作用,我不知道为什么。

我试图做unsigned long int var = 2000000; vector<int> myList[var];,但仍然是同样的错误。 (不知道是什么错误,我的程序就崩溃了)

如果你有任何想法,

谢谢

【问题讨论】:

  • 您是否要将此数组声明为局部变量?
  • 可能有帮助 - 将 var 更改为 const unsigned long int - 可变长度数组是编译器扩展,而不是 C++ 的一部分。添加const 使其“正确”,因为数组长度是在编译时确定的,这消除了可疑行为的可能来源。
  • 使用向量的向量。如您所见,尝试在堆栈上声明该大小的数组很可能会失败。如果您愿意,也可以将其设为全局或静态。 耸耸肩
  • 谢谢。我会尝试使用向量的向量,但我不明白,200 万乘以 24B 对内存来说并没有那么大:/
  • sizeof(vector) 可能在 24 字节左右。其中 200 万个大约是 45 兆字节。默认堆栈大小通常比这小得多,因此如果您尝试将其设为局部变量,则会出现堆栈溢出。在堆上,这不是那么多。

标签: c++ arrays vector


【解决方案1】:

heap and stack memory 之间有很大的不同。堆是一个不错的大空间,您可以在其中动态分配千兆字节的内存 - 堆栈在分配大小方面受到更多限制(并且在编译时确定)。

如果定义一个局部变量,这意味着它存在于堆栈中(就像您的数组一样)。有 200 万个元素,至少分配了 2MB(或假设每个向量使用约 24B 的堆栈,更像是 48MB),这对于堆栈来说是相当多的,并且可能导致崩溃。动态分配vectors 的数组(或者最好只分配vectorvectors)可确保从堆中分配大部分内存,这可能会防止这种崩溃。

您也可以使用compiler flags 增加堆栈的大小,但这通常比仅动态分配更可取。

【讨论】:

  • 感谢 hnefatl,是的,使用向量的向量它可以工作,但我仍然不明白为什么数组在堆栈中,而动态分配在堆上?不过谢谢问题解决了!
  • @Charles C++ 默认本地声明的变量在堆栈上。如果你想要动态内存,你可以在堆上分配它,但指向内存的指针在堆栈上。这就是 C++ 的方式。 vectors 在内部从堆中分配内存,而数组本质上是在堆栈上分配的(这就是为什么必须在编译时给出它们的大小)。
  • @hnefatl:不是数组进入堆栈,而是局部变量(只有它们的静态足迹!)。
  • @hnefatl: new int[2] 在堆上创建一个数组。 vector<int> foo(2);foo 放入堆栈,但 ints 仍在堆上。这有帮助吗?
【解决方案2】:

This is helpfull

my_List动态分配内存。或

将您的 int 向量数组 (my_List) 声明为全局变量,并将大小设为 `const.它们的存储位置在设计上足以分配如此大的内存大小。

对于局部变量,堆栈段可能太小而无法分配 2e6*24B。

【讨论】:

  • 有效,但建议不好。无需为此走向全球。 static 会更好,但vectors 中的vector 可以轻松完成工作。
  • @user4581301 有多种方法可以做同样的事情。考虑所有选项并不是一个坏主意。
  • 我可以通过砍掉我的腿来杀死我脚上的疣。这并不值得考虑。
猜你喜欢
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多