在 C++ 中处理大矩阵的困难

difficulties with handling big matrices in c++

我尝试在 C++ 中使用 - 甚至不是太庞大的矩阵,但似乎存在内存问题,我可能需要一些帮助。

以下代码编译时没有警告 g++ -Wall -Wextra -o matrix main.cpp 但是当我想 运行 它时,我收到以下消息:zsh: segmentation fault ./matrix 我的编译器版本是:Apple clang version 12.0.0 (clang-1200.0.32.29)

#define HEIGHT 0x1000
#define WIDTH 0x1000
#include <iostream>
#include <vector>
#include <array>

int main () {
    int hexVal = 0x0;
    std::array<std::array<int, HEIGHT>, WIDTH > matrix;
    //std::vector< std::vector<int> > matrix (HEIGHT*WIDTH);

    for (int i = 0; i < HEIGHT; i++){
        for(int j = 0; j < WIDTH; j++) {
            matrix[i][j] = hexVal;
            hexVal++;
        }
    }
    std::cout << "your matrix is living here: " << &matrix << std::endl;

    return 0;
}

我已经用 std::vector 尝试过同样的方法,但是无论我做什么,当 运行ning 时我总是会得到这个错误:zsh: segmentation fault ./matrix

至少在使用 std::array 时,它有助于改变矩阵的大小,但不幸的是,这不是一个选项。

#define HEIGHT 0x100
#define WIDTH 0x100

工作正常。

有趣的是,尽管以下方法也有效,

#define HEIGHT 0x100
#define WIDTH 0x1000

但下面没有。

#define HEIGHT 0x1000
#define WIDTH 0x100

我读了一些关于分段错误的文章,得出的结论是它可能是硬件缺陷,但此时我仍然不想相信。我希望,一些 Whosebug 魔法可以帮助我。 提前致谢。

因为 std::array 不适合非常大的矩阵,如果你把它放在堆栈上,就像你做的那样。堆栈有限,有时大小可能低于 1MB。

尝试使用 std::vector 或在堆上分配 std::array。堆没有限制,它几乎可以增长到整个 RAM 的大小。

下一个例子是使用 std::vector,在我的机器上它没有崩溃。

另请注意我如何在代码中定义 std::vector 变量,它与您的定义不同。

Try it online!

#define HEIGHT 0x1000
#define WIDTH 0x1000
#include <iostream>
#include <vector>

int main () {
    int hexVal = 0x0;
    std::vector<std::vector<int>> matrix(HEIGHT, std::vector<int>(WIDTH));

    for (int i = 0; i < HEIGHT; i++){
        for(int j = 0; j < WIDTH; j++) {
            matrix[i][j] = hexVal;
            hexVal++;
        }
    }
    std::cout << "your matrix is living here: " << &matrix << std::endl;

    return 0;
}

输出:

your matrix is living here: 000000D275CFFA28

正如@WhozCraig 所建议的,也可以使用 std::array 作为内部数组,即通过以下方式创建矩阵:

Try it online!

std::vector matrix(HEIGHT, std::array<int, WIDTH>{});