Понимание segfault со статическим размером массива std::tuple в классе

У меня есть класс, где я хочу хранить три точки данных для каждого пикселя в изображении. Я подумал, что std::tuple будет хорошим способом сделать это так:

class CameraManager {
private:
    static const int width_  = 700;
    static const int height_ = 574;
     //this causes a segfault...
    std::tuple<double,double,bool> mapping_[width_][height_];

public:
    CameraManager();

}

Segfault происходит непосредственно в main(int argc, char ** argv), потому что у меня есть объект менеджера камеры, объявленный в этой функции.

Что здесь происходит?

2 ответа

Решение

Вы кладете что-то вроде 6 МБ в стек вызовов с этим. Это действительно тот размер, когда вы хотите избежать автоматического хранения.

Попробуйте выделить его динамически.

Давайте сделаем некоторые расчеты: std::tuple<double,double,bool> на некоторых машинах стоит примерно 24 байта, поэтому матрица 700x574 будет стоить около 9'643'200 байтов, что составляет ~10 МБ.

Большинство реализаций выделяют 1 МБ, может быть, 2 МБ стека. Если ваша реализация позволяет вам указать больший размер стека, установите для него значение, превышающее ~12 МБ.

В противном случае выделить mapping_ динамически:

using my_tuple = std::tuple<double,double,bool>;
std::vector<my_tuple> mapping_;

а потом:

CameraManager() : mapping_(width_ * height_) { ... }

и, возможно, создать простой матричный вид над этим vector,

Другие вопросы по тегам