*****SPAM***** Re: C _ jak rozepsat ?__ádek
Radek Benedikt
benedikt na lphard.cz
Neděle Duben 28 23:18:11 CEST 2013
> To void* je formalna deklaracia, ktorou sa hovori, ze memcpy() ma
> akceptovat akykolvek pointer. V skutocnosti moze byt memcpy()
> implementovany tak, ze berie typ pointra do uvahy (a moze sa inlinovat,
> generovat kompilatorom, atd.atd. - ale to nesuvisi, len ilustruje, ze
> nemusite len z citania kniznice vediet, ako to presne bude prelozene); a
> ak je to pointer na word, tak ta implementacia moze predpokladat spravne
> zarovnanie. Ba dokonca pointer moze priamo v sebe niest typ na ktory
> ukazuje - implementacia pointra nie je predpisana, len jeho spravanie. No
> a pointa toho, preco memcpy() ma v nasom konkretnom pripade dovolene
> zlyhat je v tom, ze uz tym pretypovanim nespravne zarovnaneho
> cisla/pointra vznikne nespravny pointer, a jeho pouzitie *kdekolvek* inde
> v programe (t.j. aj v kniznicnej funkcii) moze vyvolat chybu; pretypovanie
> (ci uz formalne alebo explicitne) na void* ten pointer automaticky
> "neopravi".
Lepe bych to asi nenapsal, uz drevni kompilatory (treba Keeil51, sorry
za ee) maji pro jednu funkci vic knihovnich variant lisicich se
pouzitymi registry a zarovnanim. Udelat z pointeru void sebou nese dva
problemy. Prvnim je prave vyse zminena optimalizace a druhou je
"zbaveni" se otravneho prekladace a jeho vecneho kecani o tom ze tadu je
neco divneho. Nadavat na prekladac, ze neco blbe prelozil je pak spis
problem chybejici sebereflexe. Ono tech veci co umi prekladac hlidat je
pomerne moc a dost velky balik patchu co tu nekdo vytahl je vetsinou
prave o tom hlidani, aby se nekde negeneroval univerzalni kod v oblasti,
kde je HW omezeni. A nebo, prave o tom aby se serval programator, ze ma
neco blbe. Pravda, ono je to nekdy s prekladaci usmevne a obcas neni
primo napsano jak je to ci musi byt implementovano. A v 99% je to v
beznych prekladacich implementovano shodne, protoze to vyplyva s logiky
veci. Vzpominam si na mladi, kdy jsem byl presvedcen je "true" do
prekladace dame jako 0xFF. Pravda definice to nezakazoval, ta
specifikovala, ze "false" je 0 a zbytek je true. Logicke operace by
takto vychazely i docela slusne. Jenze radeji jsme pak pouzili jako
kazdy druhu "true" 0x01. A proc? Je to proste, i logicka hodnota se
mohla pouzit jako index pole a komplikace konverze hodnota -> index pole
nam za to nestala.
Radek (benedikt2hw.cz)
Další informace o konferenci Hw-list