OT:programovani v C

Jan Waclawek konfera@efton.sk
Úterý Červen 16 10:46:38 CEST 2009


Aj ja si myslim, ze to je v tomto pripade neadekvatne implementovany memcpy()...

> Ale to byla nejaka spatna knihovna, ne? 


----- Original Message ---------------
>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




Další informace o konferenci Hw-list