Nejasnost v C++

games

Re:Nejasnost v C++
« Odpověď #15 kdy: 11. 04. 2013, 08:56:41 »
Tak to nevim, snad by se nějaká optimalizace zarovnání nebo něco takového musela povolit explicitně. Sémanticky ten příklad dává smysl, tak by se to mělo doufám přeložit a taky fungovat očekávaným způsobem.
Toto opravdu fungovat nemusí, alokátor pro char může vrátit adresu zarovnanou na modulo sizeof(char), což většinou bývá méně než sizeof(int*). Pak na některých architekturách dostaneš misaligned exception. Je to prasárna.


vyvojar

Re:Nejasnost v C++
« Odpověď #16 kdy: 11. 04. 2013, 09:49:58 »
Tak to nevim, snad by se nějaká optimalizace zarovnání nebo něco takového musela povolit explicitně. Sémanticky ten příklad dává smysl, tak by se to mělo doufám přeložit a taky fungovat očekávaným způsobem.
Toto opravdu fungovat nemusí, alokátor pro char může vrátit adresu zarovnanou na modulo sizeof(char), což většinou bývá méně než sizeof(int*). Pak na některých architekturách dostaneš misaligned exception. Je to prasárna.
Škoda, že autor nenapsal, pro jakou architekturu to potřebuje. Tohle se určitě nebude týkat klasických pc, tam by to mělo být ok.

games

Re:Nejasnost v C++
« Odpověď #17 kdy: 11. 04. 2013, 10:03:10 »
Škoda, že autor nenapsal, pro jakou architekturu to potřebuje. Tohle se určitě nebude týkat klasických pc, tam by to mělo být ok.
Klasických PC se to taky týká, tam to sice nespadne, ale misaligned access do paměti je mnohem pomalejší než aligned access. Jinak se to týká ARMu, PowerPC a mnoha dalších architektur.

Jakub Galgonek

Re:Nejasnost v C++
« Odpověď #18 kdy: 11. 04. 2013, 10:07:59 »
Škoda, že autor nenapsal, pro jakou architekturu to potřebuje. Tohle se určitě nebude týkat klasických pc, tam by to mělo být ok.

Navíc norma v takových případech často říká, že výsledek takových "pochybných" operací je nedefinovaný. Toho pak kompilátor může využít k nějakým drsných (a nechtěným) optimalizacím.

vyvojar

Re:Nejasnost v C++
« Odpověď #19 kdy: 11. 04. 2013, 10:08:15 »
Škoda, že autor nenapsal, pro jakou architekturu to potřebuje. Tohle se určitě nebude týkat klasických pc, tam by to mělo být ok.
Klasických PC se to taky týká, tam to sice nespadne, ale misaligned access do paměti je mnohem pomalejší než aligned access. Jinak se to týká ARMu, PowerPC a mnoha dalších architektur.

Proč je to vůbec pomalejší? Prostě procesor pošle na adresovou sběrnici adresu, ze které chce číst a hotovo, ne ? :D


Re:Nejasnost v C++
« Odpověď #20 kdy: 11. 04. 2013, 10:10:39 »
Dobrý den, chtěl bych Vás poprosit o radu. Když jsem se snažil v cpp vytvořit dynamicky matici, nakonec se mi nepodařilo zkompilovat nic jiného než:

Kód: [Vybrat]
int **prvky;

typedef int* uint;

prvky = new uint[dimx];

for ( int j = 0; j < dimy; j++)
{
   prvky[j] = new int[dimy];
}

Ale co jsem nepochopil, proč to nejde udělat bez typedef nového typu uint.

Nevíte prosím, jaký mechanismus, předpis, zabraňuje použití:  prvky= new (int*)[dimx];

děkuji za případnou radu.
Honza

Úkoly na FIT dají jednomu zabrat co? :D Měl bych jeden takový tip: Pro reprezentaci matice není nutné použít 2D pole. Jde to dost dobře i s jednorozměrným :)

games

Re:Nejasnost v C++
« Odpověď #21 kdy: 11. 04. 2013, 10:31:41 »
Proč je to vůbec pomalejší? Prostě procesor pošle na adresovou sběrnici adresu, ze které chce číst a hotovo, ne ? :D
Sběrnice je třeba 64-bitová. Když chce procesor číst 64-bitovou hodnotu z adresy 0x1000, přečte to najednou. Když chce číst z adresy 0x1001, musí přečíst 0x1000 a 0x1008 a složit to dohromady (zjednodušeně řečeno, fyzické adresy do paměti na sběrnici budou ve skutečnosti CPU adresa děleno šířka sběrnice).

vyvojar

Re:Nejasnost v C++
« Odpověď #22 kdy: 11. 04. 2013, 10:39:18 »
Proč je to vůbec pomalejší? Prostě procesor pošle na adresovou sběrnici adresu, ze které chce číst a hotovo, ne ? :D
Sběrnice je třeba 64-bitová. Když chce procesor číst 64-bitovou hodnotu z adresy 0x1000, přečte to najednou. Když chce číst z adresy 0x1001, musí přečíst 0x1000 a 0x1008 a složit to dohromady (zjednodušeně řečeno, fyzické adresy do paměti na sběrnici budou ve skutečnosti CPU adresa děleno šířka sběrnice).

Hm, stejně mi není úplně jasné, proč by se nedalo číst z jakékoliv adresy. Nebo tam ten přístup prostě vůbec není? Jakože nejmenší možná adresovatelná jednotka v paměti je ve skutečnosti šířka sběrnice a ne jeden bajt?

games

Re:Nejasnost v C++
« Odpověď #23 kdy: 11. 04. 2013, 10:44:47 »
Jakože nejmenší možná adresovatelná jednotka v paměti je ve skutečnosti šířka sběrnice a ne jeden bajt?
Ano je to tak. CPU vždycky přečte tolik dat kolik je šířka sběrnice.