Indeksowanie tablic 2wymiarowych

0

JĘZYK C++
Pytanie łatwe, zawsze wydawało mi się że tablice 2 wymiarowe indeksuje się tak

tab[0][0] tab[0][1] tab[0][2] tab[0][3]
tab[1][0] tab[1][1] tab[1][2] tab[1][3]
tab[2][0] tab[2][1] tab[2][2] tab[2][3]

ale w jednej z książek jest niezrozumiałe dla mnie indeksowanie

tab[0][0] tab[0][1] tab[1][0] tab[1][1]
tab[2][0] tab[2][1] tab[3][0] tab[3][1]

Które jest prawidłowe ?

0

Kolejność indeksowania ma znaczenie przy optymalizacjach. Możliwe, że ten drugi sposób jest nieprzypadkowy, bo np. szybciej w pamięci odnajdują się elementy tablicy indeksowane w przytoczonej kolejności.

0

Nie rozumiem tego paradoksu, bo oba przykłady to to samo, z tym, że druga tablica ma 2 elementy w "2-gim wymiarze" najprawdopodobniej

0

a dla mnie te przykłady są dziwne, bo jeden ma tablicę 3x4 a drugi 4x2. Ani nie mają tyle samo elementów ani takich samych wymiarów. Jak to porównać? Przecież to jak stwierdzenie, że kot jest lepszy od psa bo kot miauczy. Chociaż oba są zwierzęciem i mają cztery łapy i głowę to jednak nie to samo.

No i w ogóle jak się indeksuje bo z tego co napisałeś to nic nie wynika. To czy ja sobie najpierw polecę po pierwszym czy po drugim indeksie to tylko moja decyzja a tablica zadeklarowana tak

int dupa[10][20]

jest w pamięci zawsze zapisywana tak samo niezależnie od tego co Ty byś chciał.

0

Mi chodziło o to, że kiedyś zasłyszałem, że przy odwołaniu do komórki tablicy pobierane są do bufora za jednym zamachem elementy sąsiadujące. I możliwe, że właśnie w książce uwzględniono kolejność tych elementów sąsiadujących.

0

One są identycznie indeksowane. Łamanie linii może trochę mylić. Przede wszystkim trzeba zaznaczyć, że w C/C++ tablice wielowymiarowe to tablice tablic. Nie ma tutaj żadnych rzędów ani kolumn. Elementy są w pamięci ułożone liniowo.

Więc tablica int[2][3][2] będzie w pamięci ułożona tak: [0][0][0], [0][0][1], [0][1][0], [0][1][1], [0][2][0], [0][2][1], [1][0][0], [1][0][1], [1][1][0], [1][1][1], [1][2][0], [1][2][1]. Elementy są ułożone po kolei zaczynając od najbardziej wewnętrznego wymiaru. W przypadku zwykłego indeksowania za pomocą operatora [] nie trzeba koniecznie tego pamiętać, bo operator sam obliczy potrzebny adres, ale na pewno warto mieć to na uwadze. Procesor (czasem z małą pomocą kompilatora albo programisty) potrafi przewidzieć, że za chwilę będą potrzebne elementy położone obok i pobierze je z pamięci w większej paczce (pobieranie czegoś z pamięci jest dość czasochłonne).

I dlatego taki kod:

for(int i = 0; i < dim1; i++)
	for(int j = 0; j < dim2; j++)
		sum += numbers[i][j];

wykona się zazwyczaj kilkukrotnie szybciej od

for(int i = 0; i < dim2; i++)
	for(int j = 0; j < dim1; j++)
		sum += numbers[j][i];

1 użytkowników online, w tym zalogowanych: 0, gości: 1