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

 ( NevemTeve | 2017. június 15., csütörtök - 20:53 )

http://www.complang.tuwien.ac.at/kps2015/proceedings/KPS_2015_submission_29.pdf

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

    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)

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ás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Köszönet! :)

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.

Na igen, érdemesebb az átláthatóságra gyúrni, az optimalizálást meg meghagyni a fordítónak.