Olvasmány fordító-optimalizáció ügyében

http://www.complang.tuwien.ac.at/kps2015/proceedings/KPS_2015_submissio…

Még csak belepillantottam, de jónak tűnik.

Szerk: pl. ilyesmiről hallottam a usenet sötét zugaiban: ha 'p' pointer esetleg lehet NULL, akkor pl. a strnlen(p,0) vagy a memcmp(p,q,0) is UB, tehát az optimalizáló akármit is generálhat oda, akár szándékosan rosszat is.

Kieg: itten van például ez a clang-os teszt
[code]
printf ("sin_addr at %d\n",
(int)offsetof (struct sockaddr_in, sin_addr.s_addr));

warning: using extended field designator is an extension [-Wextended-offsetof]

#define offsetof(t, d) __builtin_offsetof(t, d)
[/code]

Namostan mi a jófene ez? A kőbaltás ember kora óta jó volt nekünk az, hogy


#define offsetof(T,F) ((size_t)((char *)&(((T *)0)->F)))

No igen, de valaki észrevette, hogy vannak a múzeumban olyan architektúrák, amiken a nulla konstans (illetve nulla értékű konstans integer kifejezés) pointerként értve nem csupa nulla bit, hanem valami más. Lehet akár 0xc1cababa. Mi a megfejtés? Nyilván nem az, hogy ezeken a platformokon így változtatunk (mármint, ha a múzeumi őr egyáltalán a kérdéses készülék közelébe enged):


#define offsetof(T,F) ((size_t)(((char *)&(((T *)0)->F))-((char *)(T *)0))

Nem, a megfejtés egy __builtin_offsetof létehozása. Ami csak kicsit tud kevesebbet, mint a korábbi megoldás, de azt is megoldja nekünk a clang, feltéve, hogy megsimogatjuk az okos buksiját Milyen ügyes vagy, hogy ilyen extended-et is tudsz!

(Megjegyzés: a sizeof gondjai akkor kezdtek el sokasodni, amikor ifjabb Vér István kérésére megjelentek a VLA-k. No meg a C++ -ban az operator& bár annak tényleg semmi köze nem kellene legyen a C-hez.)

Hozzászólások

Erről jut eszembe, valaki linkelt egyszer egy előadást fordító-optimalizálás témakörben, ha jól emlékszem egy magyar előadó volt, de arra már nem emlékszem, hogy magyarul vagy angolul adott elő. Néhány C-ben írt példát hozott fel, megmutatta, milyen kódot generál belőlük a fordító (gcc, talán más is, erre már nem emlékszem), és az üzenet kb. az volt, hogy nem nagyon érdemes kódban okoskodni, mert elég okosak a fordítók. Ha esetleg megvan ez valakinek, a linket megköszönném.

sub

-----
„Egy jó kapcsolatban a társunkat az ő dolgában kell támogatni, nem a miénkben.”
rand() a lelke mindennek! :)
Szerinted…