dawwin pisze:Chociażby to, że alokowana miała być tablica 2D, a nie wektor o długości x*y. Wiem, że możnaby to pominąć przypinając odpowiednio wskaźniki, ale to rozwiązanie ma dwie wady:
Pierwsza - Załóżmy, że chcemy zaalokować tablicę 10000x10000. Próba zaalokowania tego, jako wektor może skończyć się niepowodzeniem, bo system może nie przydzielić tyle ciągłego obszaru pamięci, a 10000 mniejszych w przypadku tablicy 2D pewnie się znajdzie.
Druga - Po zaalokowaniu tablicy chciałbym dodać jeszcze jedną kolumnę. W przypadku tablicy 2D użyję po prostu funkcji realloc(), a w przypadku wektora...
Nigdzie nie widziałem informacji, że to ma być tablica 2d, a tylko, że ma za alokować pamięć na macierz (a do nich najczęściej stosuje się właśnie jednowymiarowo (tak jak są pakowane dane w pamięci ram)) - po za tym co Ci szkodzi zaalokować ciągłą pamięć, a później korzystać z tego jak z tablicy 2d oszczędzając czas na wielokrotne alokacje?.
Po pierwsze mało prawdopodobne w dzisiejszych czasach, aby nie było dostępne niecałe 50mb ciurkiem (tyle zajmuje taka macierz jak powiedziałeś). Przy tak dużych tablicach tym bardziej opłaca się sprawdzić czy znajdzie się taka duża pamięć wolna bo 10001x alokacja po 10000 float będzie trwało bardzo długo (bardziej opłaca się alokować dużą pamięć, a jak się nie mieści (wskaźnik == NULL) to zaalokować ręcznie każdy wiersz (w 99.9% przypadków zaoszczędzisz sporo czasu)).
Po drugie nie ma problemu z realokacją - jednak realokacja całości dużego obszaru pamięci jeśli zaraz za pamięcią coś jest zajmie dużo czasu, dlatego w takim przypadku polecałbym na początku alokować dużą pamięć w wektorze i zmapować ją do tablicy wskaźników
Kod: Zaznacz cały
float* tablica = (float*) malloc(sizeof(float)*N*M);
...
float **tab = (float**) malloc(sizeof(float*) * N);
for(int i = 0; i < N; i++) tab[i] = tablica + i*M;
Dzięki czemu, alokacja idzie bardzo szybko, a w razie konieczności możesz sobie realokować tab i tylko część pamięci mieć w innym miejscu (ofc trzeba sobie już zrobić zarządzanie pamięcią i dobrze odśmiecać to, ale jak najbardziej alokacja dużej ilości pamięci za jednym razem to dobry pomysł - w wielu aplikacjach pisanie własnego GC z prealokacją dużej ilości pamięci, która później jest rozdawana zmiennym, zamiast alokować wiele razy jest wręcz wymogiem).