Здесь нужно учитывать разные вещи. Во-первых, вам, вероятно, лучше определить собственный тип matrix
, который содержит один вектор данных размером sizeX*sizeY
вместе с операторами, которые отображают координаты в месте расположения элемента в векторе.
Преимущество этого подхода состоит в том, что объем памяти будет более компактным (меньше используемой памяти 1 ) и память будет смежной.
Что касается того, как должно выполняться это сопоставление, и, главным образом, с точки зрения производительности, это зависит от использования данных. Если вы собираетесь выполнять итерацию в определенном направлении, вы хотите, чтобы последовательные элементы в этом направлении занимали смежные позиции в памяти (т. Е. Если вы собираетесь выполнять итерацию с внешним циклом по Y и внутренним циклом по X, тогда формула должно быть pos = y * sizeX + x
.
1 Если предположить, что тип занимает 10 байтов, вектор из 2000 векторов из 20 элементов займет (2000+1)*sizeof(vector) + 2000*20*10
байтов, вектор из 20 векторов из 2000 элементов займет приблизительно (20+1)*sizeof(vector) + 2000*20*10
байтов, и один вектор из 2000*20
элементов занимает sizeof(vector)+2000*20*10
байт. Примерно в 64-битной платформе в выпуске без дополнительной отладочной информации, sizeof(vector<X>) ~ 3*8
(т.е. 24 байта), и итоговые значения будут: 448024
, 400504
и 400024
байты. Это может не иметь большого значения, но в первом случае используется дополнительная память на 10% по сравнению с оптимальным случаем.