1
Vývoj / Re:Rozdíl mezi ASM a strojovým kódem
« Poslední příspěvek od Jiří Havel kdy Dnes v 10:16:36 »TohleVáš kousek kódu může mít nedefinované chování kvůli aliasingu.A to prosím kde/jak?
Kód: [Vybrat]
uint32_t x = 1;
uint8_t *p = (uint8_t *)&x;
je ok jen pokud je uint8_t typedef na unsigned char. C zaručuje jen to, že uint8_t je nějaký 8b int. Že je to character, který může aliasovat, zaručené není.Dlouho byl unsigned char jediný standardní typ, na který ten typedef mohl rozumně vést. Ale C23 přišlo s _BitInt. To už zní dost lákavě na to, aby tou cestou někdo zkusil jít. Protože díky tomu aliasingu se uint8_t hůř optimalizuje.
Třeba tady kdysi probírali, jak by se dalo uint8_t oddělit od charu:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66110
Jo, jsou to hypotetické obavy. Ale tak je to s UB v C vždycky. Lepší optimalizátor začne využívat další možnosti a najednou se to rozbije.
Poslední příspěvky