OT:programovani v C

Ales Prochaska prochaska@alsoft.cz
Úterý Červen 16 11:53:48 CEST 2009


Myslel jsem to tak, že by se nezarovnaný začátek a konec překopíroval
osmibitově a prostředek (zarovnaný) 32bitově.

Aleš Procháska

> Uff, neviem, ci celkom rozumiem.. On 32-bit pristup je mozny len na
> adresu delitelnu 4. Ked struct vyzera napr. takto:
> struct{
> BYTE b;
> DWORD dw[10];
> }
> Pri nastaveni struct pack na 1B, nebude len zaciatok pola dw, ale aj
> kazdy prvok pola na adrese delitelnej 4 plus 1. T.j. vsetky DWORDy su
> nezarovnane...
> Ako som pisal, riesenim je pretypovanie memcpy((BYTE*)dw1, (BYTE*)dw2,
> sizeof(array));
> Vtedy kompilator pouzije kod, ktory cele pole skopiruje byte po byte.
> Ano, dalo by sa to riesit skopirovanim prvych 3 bytov, potom memcpy na
> zarovnane stvorice bytov a nakoniec este skopirovat 1 byte, ale rezie
> by bolo viac, ako ked sa cele pole kopiruje byte po byte. Navyse by
> bolo treba osobitne funkcie pre polia, kde dw lezi na offsetoch 2 a 3
> oproti adrese delitelnej 4. Podobne treba riesit nezarovnane wordy. A
> hlavne davat si pozor na ktory pripad, ktoru funkciu pouzit... Taky
> kod by bol neudrziavatelny.

> miro


> 2009/6/16 Ales Prochaska <prochaska@alsoft.cz>:
>> Nepomohlo by napsat vlastni memcpy ktere zkopiruje 0 az 3 byte po
>> bytech, pak pojede po zarovnanych dwordech a nakonec zase 0 az 3 byte?
>>
>> Ales Prochaska
>>
>>> Odbocka od sizeof, take pojednanie o memcpy...
>>
>>> Pekne sme sa na memcpy popalili pri vyvoji pre WinCE na platforme
>>> ARM4T. Tento procesor vyzaduje 32-bit pristup do pamati zarovnany na 4
>>> byte. Majme lokalne premenne typu poli DWORD-ov v nezarovnanych
>>> strukturach, t.j. aj na adresach nedelitelnych 4. Pouzime na ne
>>> memcpy... Kym sme sa hrali na debug verzii bez optimalizacii, vsetko
>>> behalo k spokojnosti. Ako sme urobili optimalizovany release, zamrzol
>>> cely "geret" komplet aky je aj s celym OS, kde bol nas konkretny
>>> proces iba suciastkou skladacky.
>>> Co sa stalo.. neoptimalizovana verzia memcpy kopirovala byte po byte -
>>> OK; optimalizovana chcela nacitat celych 32-bit do 32-bit registra. Z
>>> adresy nedelitelnej 4 to proste nejde. Riesenim je explicitne
>>> pretypovanie memcpy((BYTE*)dw1, (BYTE*)dw2, sizeof(array)); alebo
>>> prisne pouzivat zarovnane struktury, co vsak pri roznych datovych
>>> elementoch definovanych v protokoloch 3. stran nie vzdy ide.
>>
>>> miro
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list@list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list





Další informace o konferenci Hw-list