Zaujla ma konstrukcia
array[i+j*width]++;
Z akeheho pohladu je toto dvojrozmerne pole?
Dvojrozmerne pole je podla mna pole smernikov na typ, kde tie smerniky ukazuju nma jednorozmerne pole cize sekvencny riadok dvojromerneho pola..
Som presvedceny,ze pri takom pristupe by bol efekt nelokality dat vyssi a teda vyznam lokality dat vyssi
Je to otazka individuality programatora, ale kedeze som zvyknuty pisat uvedenu konstrukciu ako
array[j*width+i]++;
tak mi chvilu trvalo pochopit autorovu verziu. Ale ako som napisl to je vec individuality a proti gustu ziadny disputat
Z hlediska programátora v céčku je skutečně 2D pole 1D pole ukazatelů (směrníků), ale to je jen pohled programátora. V paměti je to 2D struktura s prvky uloženými za sebe. Jinými slovy, když pro 2D pole napíšu int *p=pole[3], tak sice dostanu ukazatel na čtvrtý řádek (resp. na první prvek na tom řádku), ale ten ukazatel je vypočten právě pomocí width*3 (je samozřejmě možné, že si ty ukazatele překladač někde vytvoří jako temporary hodnoty, ale obecně to neplatí, což se dá ukázat například na char pole[10000000L][1] - tam by samotné ukazatele zabraly víc než součet bytů na řádku).
To ale vsetko plati pre staticke alebo pseudostaticke pole..
ako nahale pouzivam 2D pole napr. strtuktur napr. struct dirent a potrebujem dynamicky menit velkost pola tak mam vyhodnejsie "rozhadzat" 2D tabulku na riadky, umiestnene v RAM tak, aby kazda bola v inom riadku cache a samotne struktury tak, aby tiez boli kazda v inej riadke chache... Ak je aj pole pointrov na riadky v inom riadku cache, tak dosiahnem max rychlost behu..
To je samozřejmě pravda (i v tom odkazu se o tom mluví - arrays of arrays), typické je to u polí řetězců, ale na těchto "zubatých" polích by nebyly tak pěkně vidět ty výpadky cache, resp. by se to svádělo na jiný formát této struktury.