Почему нельзя выделить многомерный массив одним новым вызовом в C ++?

В C ++ вы можете легко выделить одномерный массив следующим образом:

T *array=new T[N];

И вы также можете удалить его с помощью одной инструкции:

delete[] array;

Компилятор будет знать волшебство, как освободить правильное количество байтов.

Но почему вы не можете размещать двумерные массивы, как этот?

T *array=new T[N,M];

Или даже так?

T *array=new T[N,M,L];

Если вам нужен многомерный массив, вы должны сделать это так:

T **array=new T*[N];
for(int i=0;i<N;i++) array[i]=new T[M];

Если вам нужна быстрая программа, использующая матрицы ( матричные операции, алгоритмы собственных значений и т. д.), вы также можете использовать кеш для максимальной производительности, и для этого требуется, чтобы данные были в одном месте. Та же самая ситуация с использованием vector > . В C вы можете использовать массивы переменной длины в стеке, но вы не можете выделять их в куче (а пространство стека довольно ограничено), вы также можете создавать массивы переменной длины в C ++, но они выиграли ' t присутствовать в C ++ 0x.

Единственный обходной путь - довольно хакерский и код ошибки:

T *array=new T[N*M];
for(int i=0;i<N;i++)
   for(int j=0;j<M;j++)
   {
       T[i*N+j]=...;
   }
5
задан Tim 24 October 2010 в 16:49
поделиться