stack overflow в двумерном массиве

184
02 сентября 2018, 23:10

Почему так?

bool arr[256][4096];
arr[20][100] = true;
cout << arr[20][101]; // Stack overflow

VS2015, тест на онлайн компиляторах ошибку не выявляет :(

Answer 1

Если хочешь именно матрицу bool-ов фиксированных размеров:

#include <memory>
...
typedef bool t_arr[256][4096];
std::unique_ptr<t_arr> p_arr(new t_arr);
(*p_arr)[20][100] = true;
t_arr& arr=*p_arr; // эту ссылку используем, если лениво каждый раз разыменовывать указатель.
arr[20][100] = true;
cout << arr[20][101]; 

для современных компиляторов можно лаконичнее:

auto p_arr=std::make_unique< bool[256][4096] >();
auto& arr=*p_arr;
arr[20][100] = true;
cout << arr[20][101]; 

Другой путь ("Более С++-й"), стандартные контейнеры:

#include <vector>
...
std::vector< std::vector< bool > > arr( 256, std::vector< bool >( 4096 ) );
arr[20][100] = true;
cout << arr[20][101]; 

Недостаток второго подхода - нет сплошного поля памяти (будет сделано несколько 257 аллокаций, вместо одной, и код получится менее дружественный к кешу процессора). Достоинство: будет использовано меньше памяти (за счет специализированного std::vector< bool >, как массива битовых флагов, а не bool-ов).

READ ALSO
minGW для qt на windows 64-bit(и не только)

minGW для qt на windows 64-bit(и не только)

Я сейчас второй раз устанавливаю qtИ так как в первый раз я не понял что minGW можно скачать с qt,я решил переустановить qt чтобы вместе с ним получить...

203
Почему нельзя объявить constexpr D3DXVECTOR3?

Почему нельзя объявить constexpr D3DXVECTOR3?

Почему вот так: constexpr RECT DefaultRS = { 0,0,180,52 }; Можно, а вот так constexpr D3DXVECTOR3 DefaultCenter = { 0,0,0 }; нельзя?

210
Как вернуть std::unique_ptr из контейнера

Как вернуть std::unique_ptr из контейнера

У меня есть stl или boost контейнер хранящий std::unique_ptrКак известно std::unique_ptr поддерживают только move симатику в связи с чем возникает вопрос, как...

233
системы сборки c++ в qt

системы сборки c++ в qt

Переустановив qt (звучит как прям история,minGW для qt на windows 64-bit(и не только)) и отогнав сомнения насчет minGW я захотел в qt creator написать hello world

200