Макросы подкачки, которые берут тип, довольно хорошо известны.Portable C SWAP-макрос, который не требует аргумента 'type' и не использует memcpy.
#define SWAP(type, a_, b_) do { \
type SWAP, *a = &(a_), *b = &(b_); \
SWAP = *a; \
*a = *b; \
*b = SWAP; \
} while (0)
также: Macro SWAP(t,x,y) exchanging two arguments of type t
Можно ли реализовать эту функциональность в то же время ...
- не портативный (не компилятор конкретных
typeof
) - без использования вызовов функций, таких как
memcpy
(что не гарантировано для оптимизации, it не было в моих тестах, по крайней мере)
Я придумал недостатки метод, который использует-структуру, определенную как размер входных данных.
#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
получает проложенный компилятором (в зависимости от ССЗ __packed__
не будет работать, но тогда его больше не портативный)
Он также может иметь проблемы с выравниванием в зависимости от архитектуры.
Интересный вопрос, но почему? – tangrs
Почему нет 'memcpy()' но назначение в порядке? – pmg
Ваш подход также вызывает неопределенное поведение из-за нарушения псевдонимов. – Sneftel