OT:programovani v C

Hynek Sladky econf@centrum.cz
Úterý Červen 16 12:33:08 CEST 2009


Podle me tam je vetsinou ten problem, ze pokud se uz kopiruje mezi 
nezarovnanymi adresami, tak vetsinou nejsou stejne "liche": tj. (ptr1&3) 
!= (ptr2&3), takze kdyz dorovnam prvni ukazatel na modulo 4 adresu, je 
druhy ukazatel stale na nezarovnane adrese. Takze bud mit vzdy 
zarovnanou adresu nebo vzdy pouzivat bytove kopirovani...

Hynek Sladky


Ales Prochaska wrote:
> 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
> 
> 
> 
> _______________________________________________
> 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