Jeśli zadeklaruję tablicę 2d w stylu c
int data[X][Y]
Zakładam, że kompilator utworzy to jako pojedynczą tablicę podobną do
int data[X*Y]
ale czy to jest gwarantowane?
Powiedzmy, że dla uproszczenia używamy standardowych kompilatorów w architekturze x86. A teraz
int data[X][Y][Z]
?
Czy kompilator tworzy to jako ciągły blok pamięci i po prostu majstruje przy przesunięciach?
Zwykle używam pojedynczego wektora dla tablicy 2dz przesunięciem wiersza * NumCols + col i mieć funkcję wstawiania, aby ją dla mnie obliczyć, ale byłem zainteresowany tablicą 3d dla tego pytania. Powinienem również zapytać, czy ktoś zrobił to z jednym wektorem i jaka byłaby również logika przesunięcia.
Odpowiedzi:
8 dla odpowiedzi № 1Tak, tablice wielowymiarowe dowolnego rzędu w C są ciągłe. Są to „tablice tablic”, że tak powiem. Dużo więcej na comp.lang.c FAQ, sekcja 6, Tablice i wskaźniki.
6 dla odpowiedzi nr 2
Powstałe tablice będą ciągłe w obszarze pamięci wirtualnej przypisanym do procesu. Tablice mogą nie być ciągłe w pamięci fizycznej, ale nie powinno to mieć dla ciebie znaczenia.
2 dla odpowiedzi nr 3
Elementy w tablicach są zagwarantowane, że są ciągłe, więc układ jest taki sam w obu przypadkach.