Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
nou
Založen: 28. 07. 2007 Příspěvky: 1047
|
Zaslal: 15. prosinec 2007, 16:12:41 Předmět: |
|
|
Yossarian napsal: |
Pavel> no, zarovnani do 4b se da vypnout, minimalne v ms kompilatoru pomoci
#pragma pack (1) |
da sa to aj inde. len by ma zaujimalo preco to zarovnanie existuje. je vdaka tomu nejaky vykon naviac alebo co? _________________ Najjednoduchšie chyby sa najtažšie hľadajú. |
|
Návrat nahoru |
|
|
MePHyst0
Založen: 28. 07. 2007 Příspěvky: 85 Bydliště: SVK/CZK
|
Zaslal: 15. prosinec 2007, 16:26:22 Předmět: |
|
|
je to preto aby boli struktury cache friendly(samozrejme ak sa potom s nimi tak aj nepracuje tak to nema vyznam ) a pekne adresovatelne |
|
Návrat nahoru |
|
|
Quiark
Založen: 29. 07. 2007 Příspěvky: 816 Bydliště: Chlívek 401
|
Zaslal: 15. prosinec 2007, 17:36:14 Předmět: |
|
|
Tuším, že 32bitový procesor je radši, když dostává pěkně 32bitové hodnoty, případně adresy zarovnané na 32 bitů. Podobně to bude asi platit i pro 64bitové procesory. _________________ Mám strach |
|
Návrat nahoru |
|
|
rezna
Založen: 27. 07. 2007 Příspěvky: 2156
|
Zaslal: 15. prosinec 2007, 17:48:24 Předmět: |
|
|
Quiark napsal: |
Tuším, že 32bitový procesor je radši, když dostává pěkně 32bitové hodnoty, případně adresy zarovnané na 32 bitů. Podobně to bude asi platit i pro 64bitové procesory. |
nejenomze je radsi, ale v pripade ze to nezarovnas to pri vypoctech stejne zarovna aby mu to vyslo do registru
proto ikdyz potrebuju pracovat s nezarovnanymi daty, automaticky si rucne tu strukturu zarovnam na potrebny pocet bitu, aby to bylo delitelne 32bity. |
|
Návrat nahoru |
|
|
johnnash
Založen: 30. 07. 2007 Příspěvky: 80
|
Zaslal: 15. prosinec 2007, 18:09:10 Předmět: |
|
|
Spis jde o to ze pocitaci ktery ma 32-bitovou adresovou sbernici v pripade ze data nelezi na nasobku 4 bajtu a cteme treba int tak je nutne provest dvakrat operaci cteni. |
|
Návrat nahoru |
|
|
MD
Založen: 29. 07. 2007 Příspěvky: 437 Bydliště: Praha
|
Zaslal: 15. prosinec 2007, 19:23:54 Předmět: |
|
|
Quiark napsal: |
Tuším, že 32bitový procesor je radši, když dostává pěkně 32bitové hodnoty, případně adresy zarovnané na 32 bitů. Podobně to bude asi platit i pro 64bitové procesory. |
Na 64bitech jsou jeste daleko prisnejsi podminky. Fakt dlouhy clanek o zarovnavani je zde: http://msdn2.microsoft.com/en-us/library/aa290049.aspx _________________ - play with objects - www.krkal.org - |
|
Návrat nahoru |
|
|
opice
Založen: 29. 07. 2007 Příspěvky: 39
|
Zaslal: 16. prosinec 2007, 00:05:27 Předmět: |
|
|
K prvnimu dotazu: velikost int neni nedefinovana, jak tu nekdo tvrdil, ale je to vzdy velikost adresace procesoru....
a dale velikost maleho bool je implementacne zavisla, neni definovana ve standardu, pekne pojednani o malem bool a velkem BOOL je zde:
http://www.codeguru.com/forum/showthread.php?t=332831 |
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 16. prosinec 2007, 00:21:46 Předmět: |
|
|
opice napsal: |
K prvnimu dotazu: velikost int neni nedefinovana, jak tu nekdo tvrdil, ale je to vzdy velikost adresace procesoru.... |
To se říkalo v dobách přechodu z 16bit na 32bit systém. Velikost adresace procesoru (systému) je size_t, tzn. sizeof(void*) == sizeof(size_t). int je 32bit integer na všech procesorech 32bit, 64bit a dokonce i na itanium 64bit, na G++ i VC++. C++ norma specifikuje o velikostech typů pouze to, co tu říkal rezna, nic víc (že jeden musí být <= jak druhý).
Při přechodu na 64bit systém se změní akorát sizeof(long) na 8. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
opice
Založen: 29. 07. 2007 Příspěvky: 39
|
Zaslal: 16. prosinec 2007, 00:33:57 Předmět: |
|
|
Hmm, tak to nevim. Ale VC++ 2008 ted meni uz velikost int pro 64 bitovy kod na 64 bitu, takze u MS to tak bude. Jinak samozrejme standard o velikosti int nic nerika.
Eosie napsal: |
opice napsal: |
K prvnimu dotazu: velikost int neni nedefinovana, jak tu nekdo tvrdil, ale je to vzdy velikost adresace procesoru.... |
To se říkalo v dobách přechodu z 16bit na 32bit systém. Velikost adresace procesoru (systému) je size_t, tzn. sizeof(void*) == sizeof(size_t). int je 32bit integer na všech procesorech 32bit, 64bit a dokonce i na itanium 64bit, na G++ i VC++. C++ norma specifikuje o velikostech typů pouze to, co tu říkal rezna, nic víc (že jeden musí být <= jak druhý).
Při přechodu na 64bit systém se změní akorát sizeof(long) na 8. |
|
|
Návrat nahoru |
|
|
Marek
Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 16. prosinec 2007, 17:37:55 Předmět: |
|
|
opice napsal: |
Hmm, tak to nevim. Ale VC++ 2008 ted meni uz velikost int pro 64 bitovy kod na 64 bitu, takze u MS to tak bude. Jinak samozrejme standard o velikosti int nic nerika. |
Nikde jsem na netu nenašel, že se to bude měnit. Ono by se to ani měnit nemělo, protože by jim nezbyl žádný datový typ, který by reprezentoval 32bit integer.
EDIT: Pokud to tak nastavili, tak je to proti C++ normě. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
|
tempicek
Založen: 04. 12. 2007 Příspěvky: 62
|
Zaslal: 17. prosinec 2007, 00:00:35 Předmět: |
|
|
Mno, nechtel jsem se do toho vkladat, kdyz se tu reklo tolik faktu (ktere uz jsou celkem daleko od puvodniho dotazu ), ale taky se tu reklo par polopravd a par blbosti, tak je asi na case to trochu zrekapitulovat
Podle standardu si muzete byt jisti tim, ze sizeof( char ) == 1 a ze sizeof(short int) <= sizeof(int) <= sizeof(long int). A to je z tehle kapitoly skoro vsechno Takze rozhodne nespolehat na to, ze bool je 1, 8 nebo 32 bitu. A to neplati pouze pro bool, ale pro typy obecne. Hlavne se probuh vyhnete ukladani pointeru do intu a podobnym unix-era zhuverilostem.
Obdobna vystraha plati pro velikosti struktur. struct S { char a; } totiz s nejvetsi pravdepodobnosti *nebude* mit velikost 1 byte! Jak uz bylo receno, aplikuje se na struktury zarovnani zpravidla na 4 byty, ale ani na to se nada sazet! Kdyz si to jooo extra chcete pojistit (treba nacitani struktury ze souboru), tak "#pragma pack" se da pouzit na definovani velikosti zarovnani.
Zarovnava se z mnoha duvodu, jednim z hlavnich je redukce poctu "cache-miss". Pamet (operacni i vyrovnavaci) je totiz take zarovnavana a data nejsou zpravidla ctena po bytech (konkretni velikost je dana architekturou - predevsim velikosti sbernice), ale po vetsich celcich. Tyhle celky byvaji obvykle mocniny dvou, takze je dobre na ne provadet zarovnani polozek v pameti, aby polozky nelezely na rozhrani vice bloku, nez je nezbytne nutne (pokud je blok 4 byty velky, potrebujete na 4bytovou promennou pouze jeden blok, spatnym umistenim muzete vsak zasahnout dva). S tim souvisi i nasobne cteni z pameti (jakekoli! i cache) - spatne umistena data musite nacitat vice instrukcemi. Ale souvisi to samozrejme i s velikostmi registru a jinymi vecmi, ale je tezke zavdecit se kazdemu aspektu architektury ... napriklad registru je v kazde architekture vice a zpravidla i ruznych velikosti, proto se pro ruzne velikosti data pouziji i ruzne instrukce, potazmo ruzne registry ... tim bych se tedy az tak nezabyval, pokud nekodite primo v asm na perfektne definovanou architekturu.
Nevim o tom, ze by se ve VC2008 zmenil int na 64bitu pro 64bitovy compiler; nevylucuji to, ale rozhodne by to neznamenalo absenci 32bitoveho typu - jak uz bylo receno - neni to definovano normou jazyka, takze si to zadefinuje vyrobce kompilatoru.
Rozhodne neplati, ze by byla velikost intu dana velikosti adresace. Takze opet - zadne prasarnicky s pointery!
Zarovnavat rucne - je dobry napad v pripade enumu nebo struktur, kde potrebujete presne vedet co tam kde najdete (opet priklad s nacitanim struktur ze souboru). Obecne bych pred tim opet varoval, nechte to na kompilatoru! Ti kluci vetsinou velmi dobre vedi co delaji a prelozi kod inteligentne pro danou platformu.
Setreni pameti v podobe zhustovani "flagu" do jedne promenne - ok, proc ne, ale s mirou. Pokud jsou to skutecne flagy typu "file attribut" a podobne, ma to svuj smysl. Obecne je ta pamet dnesk vazne levna a nejake skladani promennych dohromady musi mit vetsi opodstatneni nez setreni pameti (napr. rychlost prenosu). Kolik takovych promennych v programu mate? 10 000? Tzn. 40 kB i pri pouziti 32bitove promenne na jednu? Co to je? (Nerikam plytvat, plytvat, plytvat, ale setrit tam, kde to ma smysl - hlavne se vyhnout chybam).
Mno, jeste par veci jsem chtel napsat, ale leniveji mi prsty. Takze jen shrnu - jestli v techhle vecech nemate 100% jasno, vyhnete se jim obloukem a usetrite si cas pri ladeni Pro pokrocile ta varovani samozrejme neplati, tam je namiste spis varovani, aby neprecenovali sve schopnosti |
|
Návrat nahoru |
|
|
xtopi
Založen: 11. 08. 2007 Příspěvky: 24 Bydliště: La republica Checa
|
Zaslal: 27. prosinec 2007, 15:29:13 Předmět: |
|
|
Já mám C++ tak rád, ale přesně tohle se mi na něm nelíbí - kolik komentářů a textu se napsalo na jeden triviální dotaz.... |
|
Návrat nahoru |
|
|
niXon
Založen: 27. 10. 2007 Příspěvky: 22
|
Zaslal: 10. květen 2008, 19:37:32 Předmět: |
|
|
no samozrejme ze to v podstate nema vyznam, ale vezmite si, ze by ste mali kvantum (ked hovorim kvantum tak obrovske kvantum) hodnot na 1/0, a mate ich poslat cez sietove spojenie? tak tam uz nejde o vykon PC, ale o traffic... tam sa taketo "haluze" zidu ... ked si zoberiete ze z "tradicneho" (vecsinoveho) 32 bitoveho intu urobite 32 hodnot, tak mate 32x znizenie prenosu cez net... to je myslim si ze dost postacujuci dovod aby som sa takymito vecami zaoberal (a nielen ja) |
|
Návrat nahoru |
|
|
Ash
Založen: 30. 07. 2007 Příspěvky: 13 Bydliště: Bratislava
|
Zaslal: 10. květen 2008, 20:31:36 Předmět: |
|
|
niXon,
Šablóna triedy std::vector<> má špecializáciu std::vector<bool>, ktorá vcelku elegantne rieši problémy s poľom boolovských premenných. |
|
Návrat nahoru |
|
|
OndraSej
Založen: 28. 07. 2007 Příspěvky: 767 Bydliště: Brandýs nad Labem
|
Zaslal: 10. květen 2008, 22:37:03 Předmět: |
|
|
niXon> to sice mas pravdu, na druhou stranu delat sitovou komunikaci primym kopirovanim z pameti je jeden z nejlepsich zpusobu jak si zajistit spoustu krasnych problemu. Takze resit, jaka je velikost booleanu v pameti, kvuli ukladani nebo sitim zas tak velky smysl nema _________________ http://trionteam.net |
|
Návrat nahoru |
|
|
|