2010-08-29 2 views
1

я следующий код для распределения двумерного массиваДвумерное распределение массива

#include <iostream> 
using namespace std; 
int **malloc2d(int r,int c){ 
    int **t=new int*[r]; 
    for (int i=0;i<r;i++) 
     t[i]=new int[c]; 

     for (int i=0;i<r;i++){ 
      for (int j=0;j<c;j++){ 
       t[i][j]=i+j; 
      } 
     } 
    return t; 
    } 

int main(){ 
    int m=10; 
    int n=10; 
    int **a=malloc2d(m,n); 
    for (int i=0;i<m;i++){ 
      for (int j=0;j<n;j++){ 

       cout<<a[i][j]<< " "; 
       cout<< " \n"; 
      } 
      cout<< " \n"; 
    } 


    return 0; 


} 

это работает, но мой вопрос: насколько хорош этот код в соответствии с производительностью или эффективности оборудования в зависимости от скорости кода? спасибо

+0

Ну, это утечка памяти. – kennytm

+3

Утечки, и грубая. Вы должны обернуть ресурсы, например 'std :: vector'. До тех пор, пока ваша программа верна, кто заботится о скорости? – GManNickG

+0

Опять же, используйте клавишу табуляции, чтобы отступом. Программирование намного проще, если вы используете редактор, который поддерживает вкладки. – Potatoswatter

ответ

3

С int ** у вас есть много указателей на маленькие пространства (4 байта) памяти, которая является неэффективным из-за таНос накладных расходов (каждая реализация таНоса имеет накладные расходы, минимальный обычно составляет sizeof(void*) AFAIK в вашем случае будет означать для всех «ячеек» есть по крайней мере 100% накладных расходов).

В качестве альтернативы вы можете использовать одномерный массив и рассчитать индексы самостоятельно следующим образом: index = (row * num_columns) + column. Тем не менее, вы потеряете красивую ноту a[row][column]. Тем не менее, он должен быть быстрее для доступа, потому что в вашем (чистом) решении должны быть две разметки указателя (операции с памятью), в то время как я предлагаю вам только один. Это будет выглядеть примерно так:

#include <iostream> 

using namespace std; 

inline int a_index(int row, int column, int column_size) { 
     return((row * column_size) + column); 
} 

int *malloc2d(int r,int c) { 
     int *t=new int[r * c]; 
     for (int i=0;i<r;i++){ 
       for (int j=0;j<c;j++){ 
         t[a_index(i,j,c)]=i+j; 
       } 
     } 
     return t; 
} 


int main(){ 
     int m=10; 
     int n=10; 
     int *a=malloc2d(m, n); 
     for (int i=0;i<m;i++){ 
       for (int j=0;j<n;j++){ 
         cout<<a[a_index(i,j,n)]<< " "; 
         cout<< " \n"; 
       } 
       cout<< " \n"; 
     } 

     return 0; 
} 
0

Если вы не удаляете память, которую вы выделили, используя новую, то вы будете утечки памяти.

+0

так что в основном просто пишите delete a в конце программы и никаких проблем? –

+0

@ c-programmer: Пока вы не забудете или не работаете с более сложным кодом, который может вызывать исключения. Вы действительно хотите сделать шаг назад, [получить хорошую книгу] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) и изучить хорошие основы. – GManNickG

+0

@GMAN спасибо, я знаю, но проблема в том, что у меня нет денег на покупку книг, которые мне нужны, к сожалению, у меня большие проблемы с покупками книг. –

1

Предполагается, что вы планируете добавить delete[], или программа завершится до того, как проблема утечки.

В любом случае, это будет не очень эффективно.

Во-первых, массив будет состоять из несмежных блоков памяти. Это затрудняет работу подсистемы памяти машины.

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

Просто сделай это по старинке:

int *a = new int[ r * c ]; 

или vector

std::vector<int> a(r * c); 

и вычислительными индексов, как никогда:

cout << a[ i * c + j ] << ' '; 

Однако, так как вы зацикливание над весь массив, вы можете игнорировать двумерность, кроме форматирования:

for (int i = 0; i < r * c; ++ i) { 
    cout << a[ i ] << ' '; 
    if (i % c == c-1) cout << '\n'; 
} 
Смежные вопросы