У меня есть кое-что, для чего мне нужен 2D-массив, но для лучшей производительности кэша я бы предпочел, чтобы это был обычный массив. Вот идея, которая у меня была, но я не знаю, ужасная ли это идея:
const int XWIDTH = 10, YWIDTH = 10;
int main(){
int * tempInts = new int[XWIDTH * YWIDTH];
int ** ints = new int*[XWIDTH];
for(int i=0; i<XWIDTH; i++){
ints[i] = &tempInts[i*YWIDTH];
}
// do things with ints
delete[] ints[0];
delete[] ints;
return 0;
}
Таким образом, идея состоит в том, что вместо new
набора кучек массивов (и размещения их в разных местах в памяти) я просто указываю на массив, который я создал все сразу.
Причина delete[] (int*) ints;
заключается в том, что я на самом деле делаю это в классе, и это сэкономит [тривиальные объемы] памяти, чтобы не сохранить исходный указатель.
Просто интересно, есть ли причины, это ужасная идея. Или, если есть более простой / лучший способ. Цель состоит в том, чтобы иметь доступ к массиву как ints[x][y]
, а не ints[x*YWIDTH+y]
.
РЕДАКТИРОВАТЬ: простой тест предполагает, что мой путь быстрее без оптимизатора, но gcc может по какой-то причине лучше оптимизировать простой способ.
http://pastebin.com/YDRuLuXv
Если вы компилируете с помощью gcc -O0, лучшим должен быть стек, затем мой, а затем обычный. Если вы компилируете с X_MAX, установленным на большое значение, и Y_MAX, установленным на небольшое значение, и используете gcc -O3, мой и стек должны быть действительно очень быстрыми, но нормального не будет. Если вы сделаете X_MAX маленьким, а Y_MAX большим, нормальный способ должен победить (даже по некоторым причинам над стековым методом).