我正在使用以下代码在堆栈上创建一个位集数组:

int Rows = 800000;
int Columns = 2048;

bitset<Columns> data[Rows];

如果我不将堆栈大小提高到数百兆字节,则会出现堆栈溢出错误。

有没有办法在堆上分配这段代码?例如使用这样的代码(我什至不确定这段代码是否正确):
bitset<Columns>* data[Rows] = new bitset<Columns>();

编辑: 更重要的是,这是否有助于内存使用或速度?我为此使用堆栈还是堆有什么区别吗?我真的不想使用任何其他库,例如 Boost ......

我来自 Java 背景,一些 C++ 语法对我来说是新的,如果问题看起来有点错误,抱歉。

最佳答案

#include<bitset>
#include<vector>

constexpr int Rows = 800000;
constexpr int Columns = 2048;

int your_function() {
  std::vector<std::bitset<Columns> > data (Rows);

  // do something with data
}

这将在堆上分配内存,它仍然会占用之前占用的任何内存量(加上几个字节用于簿记)。然而,堆不像堆栈那样受固定大小的限制,而主要受系统内存量的限制,因此在相当现代的 PC 上,几百兆字节应该没问题。

我不确定这是否是您的担忧,但 bitset 的内存使用率并不低效 - gcc 上的 sizeof(std::bitset<2048>) == 256 因此您不会在那里浪费任何一点。

关于c++ - 在堆上分配 bitset<N> 数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47553676/

10-12 20:36