tablice wielowymiarowe

0

Witam,

Mam pytanie odnosnie tablic dwuwiarowych bo wydawalo mi sie ze wszystkie elementy umieszczone sa obok siebie jeden po drugim ale po sprawdzeniu adresow wyglada ze jest inaczej i chcialem sie zapytac jak to jest naprawde, powiedzmy mamy tablice int tab[5][5], to czy te wszystkie 25 pól jest umieszczonych obok siebie w pamieci, czy tylko kazde 5 jest umieszczone obok siebie, a kolejne 5 juz zupelnie gdzie indziej?

0

w c+ wytępuje deklaracja. Więc tam gdzie jest deklarowana tablica, tam jest umiejscowiona.
A teraz dla jasności, int tab[5][5] to tablica 5 wierszy 5 kolumn - jedna.

0

a czy jak tworze taka tablice dwuwymiarowa dynamicznie to tez bedzie tak samo?

0

Staraj się nie używać wielowymiarowych tablic - zazwyczaj dużo lepszą opcją jest symulowanie wielu wymiarów na jednowymiarowej tablicy.

2

Tablice zawsze umieszczone są w ciągłym bloku pamięci. (C++ - 8.3.4.1) Dotyczy to też tablic wielowymiarowych, które to przechowywane są w porządku row-major. (C++ - 8.3.4.9)

W przypadku "wielowymiarowych" tablic dynamicznych nic takiego nie obowiązuje i zależy od sposobu implementacji.. Jeżeli używasz do tego podwójnego wskaźnika (czyli tablicy wskaźnków na kolejne wiersze), wiersze mogą być rozrucone dowolnie po pamięci.

0

Ok, wlasnie o to mi chodzilo bo jak zrobilem normalnie tablice to mialem wszystkie 25 elementow obok siebie, a jak dynamicznie to byly one pogrupowane w pamieci po 5 elementow w roznych miejscach.

0

Jeśli robiłeś tablicę dynamiczną tak jak najczęściej się to robi, to pojedynczy wiersz masz dynamicznie alokowany. Możesz się więc spodziewać że indeksując kolumnami, będziesz miał przesunięcie w adresach zależne od przechowywanego typu czyli ciągłe. Już jednak każdy wiersz, może zaczynać się od zupełnie innego adresu. Tablice dynamiczne są jednak "niezdrowe" z 2 powodów:

  1. Bardzo łatwo popełnić błąd w ich deklarowaniu/definiowaniu/obsłudze i w C++ są od tego lepsze konstrukcje (choćby std::vector lub std::array jeśli chcesz mieć "surową tablicę" lub std::valarray jeśli będą wykonywane obliczenia arytmetyczne i konieczną dużą wydajnością)
  2. Mogą dawać bardzo dziwne efekty we współpracy z cache procesora. Cache (jeśli nie zadbasz o ich dobrą a o błąd bardzo łatwo), będzie się "szamotał" i będzie często opróżniany tak że procent trafień może totalnie pogrążyć wydajność.

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