OT:programovani v C

Miroslav Šinko sinkomiro@gmail.com
Úterý Červen 16 10:29:43 CEST 2009


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