最大数量 stl::list 对象

Maximum number of stl::list objects

本文关键字:list 对象 stl 最大数      更新时间:2023-10-16

问题是在数据集中找到周期图模式。所以我有 1000 个时间步,每个时间步都有一个图形(编码为整数)。因此,图形可以发生 999 个可能的周期。我还定义了一个定义为(时间步长修改周期)的相位偏移。对于在第 5 个时间步长中首次看到的周期为 2 的图形,相位偏移为 1。

我正在尝试在C++中创建二维列表数组。每个单元格包含一个列表,其中包含具有指定周期和相位偏移的图形。我一直在相应的列表中插入图表。

list<ListNode> A[timesteps][phase offsets]

ListNode 是一个具有 4 个整数变量的类。

这给了我分段错误。使用 500 作为大小运行良好。这是由于内存不足还是其他问题?

谢谢。

可能是由于堆栈大小有限。

您正在创建一个包含 1000x1000 = 1000000 个对象的数组,几乎可以肯定每个对象至少为 4 个字节,因此至少大约为 4 MB。假设它位于函数内部,它将auto存储类,通常转换为在堆栈上分配。典型的堆栈大小约为 1 到 4 MB。

尝试类似这样的操作:std::vector<ListNode> A(1000*1000);(如有必要,创建一个包装器以使其看起来是二维的)。

编辑:包装器会重载运算符以为您提供 2D 寻址:

template <class T>
class array_2D { 
    std::vector<T> data;
    size_t cols;
public:
    array_2D(size_t x, size_t y) : cols(x), data(x*y) {}
    T &operator()(size_t x, size_t y) { return data[y*cols+x]; }
};

你可能想修饰它(例如,用边界检查),但这是一般的想法。解决它将使用 () ,如:

array_2d<int> x(1000, 1000);
x(100, 3) = 2;
y = x(20, 20);

听起来您的堆栈空间不足。尝试将其分配给堆上,例如通过 std::vector ,并包装try ... catch以查看内存不足错误而不是崩溃。

(编辑:不要使用std::array因为它也会在堆栈上分配。

try {
   std::vector<std::list<ListNode> > a(1000000);   // create 1000*1000 lists
   // index a by e.g. [index1 * 1000 + index2]
   a[42 * 1000 + 18].size(); // size of that list
   // or if you really want double subscripting without a wrapper function:
   std::vector<std::vector<std::list<ListNode> > > a(1000);
   for (size_t i = 0; i < 1000; ++i) {   // do 1000 times:
       a[i].resize(1000);                // default-create and create 1000 in each
   }
   a[42][18].size(); // size of that list
} catch (std::exception const& e) {
    std::cerr << "Caught " << typeid(e).name() << ": " << e.what() << std::endl;
}

在 32 位系统上的 libstdc++ 中,std::list 对象的权重为 8 个字节(仅对象本身,不包括它可能进行的分配),即使在其他实现中,我认为也不会有太大不同; 因此,您正在分配大约 8 MB 的数据,这在普通计算机上本身并不多, 但是,如果您将该声明放在函数中,它将是一个局部变量,因此在堆栈上分配,其大小非常有限(最多几 MB)。

您应该在堆上分配该东西,例如使用 new ,或者更好地使用 std::vector

顺便说一句,您需要一个 1000x1000 的std::list数组似乎不对,您能准确指定您要实现的目标吗?可能有一些数据结构更适合您的需求。

您正在声明一个二维数组[1000] x [1000]list<ListNode>。我不认为这是你的意图。

分段错误可能是由于尝试使用无效的列表元素。