Переносимый макрос SWAP C, который не требует аргумента type и не использует memcpy
Макросы подкачки, которые принимают тип, довольно хорошо известны.
#define SWAP(type, a_, b_) do { \
type SWAP, *a = &(a_), *b = &(b_); \
SWAP = *a; \
*a = *b; \
*b = SWAP; \
} while (0)
также:Макрос SWAP (t, x, y), обменивающийся двумя аргументами типа t
Возможно ли реализовать эту функциональность, будучи ...
переносимый (не зависит от компилятораtypeof
)без использования вызовов функций, таких какmemcpy
(который не может быть оптимизирован,это не было в моих тестах по крайней мере)
Я придумалнедостатки метод, который использует структуру, определенную как размер входных данных.
#define SWAP(a_, b_) do \
{ \
struct { \
char dummy_data[sizeof(a_)]; \
} SWAP, *a = (void *)(&(a_)), *b = (void *)(&(b_)); \
/* ensure sizes match */ \
{ char t[(sizeof(a_) == sizeof(*a)) ? 1 : -1]; (void)t; } \
/* check types are compatible */ \
(void)(0 ? (&(a_) == &(b_)) : 0); \
SWAP = *a; \
*a = *b; \
*b = SWAP; \
} while (0)
... но он может потерпеть неудачу, если временныйstruct
дополняется компилятором(В зависимости от GCC__packed__
будет работать, но тогда его больше не будет портативным)
Это также может иметь проблемы с выравниванием в зависимости от архитектуры.