S klíčovým slovem register je to podobné jako s inline. Kromě specifického využití v případě static inline nemá smysl mikrooptimalizovat pomocí inline, protože a) překladače to umí většinou lépe, b) výkonnostní problém zcela určitě není v tom, že něco je nebo není inline.
Jinak typeof bylo užitečné i před přidáním auto v případě maker (a rozšíření ({ .... })), například:
#define SWAP(a, b) \
{ \
typeof(a) __tmp_swap = a;
a = b; \
b = __tmp_swap; \
}
#define MOVE_OWNERSHIP(source) \
({ \
__typeof__(source) __ownership = (source); \
(source) = NULL; \
__ownership; \
})
Userspace RCU používá typeof také poměrně hojně.
4. 8. 2026, 07:20 editováno autorem komentáře
S tím inline jo a ne. Když tu funkci chci strčit do headeru aby to překladač mohl inlinovat, tak tam to inline dát musím.
Pak je taky třeba Ob1 ve visual studiu, kde to bez inline inlinovat nebude.
Ale já jsem primárně na C++, my to inline máme trochu příčetnější.
Ono C není jazyk, ale rodina vzájemně nekompatibilních jazyků, které se jen zákeřně podobají :)
A v dřevních dobách C11+:
#include <stddef.h>
#include <string.h>
#define SWAP(a, b) \
do { \
/* Check size */ \
_Static_assert(sizeof((a)) == sizeof((b)), "SWAP() arguments have different size, check usage" ); \
/* Ensure alignment of __tmp_swap */ \
union { \
char buf[sizeof((a))]; \
max_align_t max_align; \
} __tmp_swap; \
/* Moves */ \
memcpy(__tmp_swap.buf, &(a), sizeof((a))); \
(a) = (b); \
memcpy(&(b), __tmp_swap.buf, sizeof((b))); \
} while (0)
Tohle makro má malou drobnou výhodu, kterou většinou nepotřebujete, a to, že funguje i na non-aligned proměnných. Ale FTR je lepší použít `memmove()` (a to i přes to, že většina implementací už má `memcpy()`, které funguje i pro překrývající se paměťové oblasti).
4. 8. 2026, 14:49 editováno autorem komentáře
K čemu memmove? Ten temp by se už z principu neměl překrývat s ničím.
Tady už je možná lepší použít memcpy, protože UB aspoň v nějakém validačním režimu dává překladači možnost hlásit chybu.
BTW ten max_align_t z předchozího příkladu je všechno jen ne "max". Třeba na SSE/AVX typy rozhodně nestačí (teda na memcpy jo, ale memcpy musí zvládnout zarovnání na char). To samé [u]intmax_t. Kvůli zpětné kompatibilitě ho jaksi nejde zvětšit. :)
4. 8. 2026, 14:59 editováno autorem komentáře
Ja som sa k tomu uchylil na ESP32 z dovodu, ze bud slo o nejaky malo pouzivany snippet pripadne kriticky blok, kde som nechcel aby zbytocne skakalo. Nebil by som sa o to, ze to bolo velmi dolezite a na desktope by som to asi tiez neriesil, ale v pripade C sa moze jednat o slabsie stroje, kde by to mohlo mat specificke vyuzitie.