Я читал о замене содержимого переменных без использования временной переменной и, кроме знаменитого алгоритма xor, я узнал о инструкции XCHG из сборки на x86. Поэтому я написал этот код:Обмен значениями с использованием регистров
void swap(int *left, int *right){
__asm__ __volatile__(
"movl %0, %%eax;"
"movl %1, %%ebx;"
:
: "r" (*left), "r" (*right)
);
__asm__ __volatile__(
"xchg %eax, %ebx;"
);
__asm__ __volatile__(
"movl %%eax, %0;"
"movl %%ebx, %1;"
: "=r" (*left), "=r" (*right)
);}
Он действительно работает, но потом я понял, что инструкция XCHG вообще не нужна.
void swap(int *left, int *right){
__asm__ __volatile__(
"movl %0, %%eax;"
"movl %1, %%ebx;"
:
: "r" (*left), "r" (*right)
);
__asm__ __volatile__(
"movl %%ebx, %0;"
"movl %%eax, %1;"
: "=r" (*left), "=r" (*right)
);}
Вторая функция тоже работает, но никто, кажется, уже замена переменных с использованием регистров, так как этот код считается неправильным и в действительности это на самом деле не работает должным образом? Я что-то упускаю?
Я понимаю, что это будет работать только для x86, но поскольку большинство людей имеют процессор intel x86, может ли этот код использоваться в любом реальном программировании? Я понимаю, что это, вероятно, не будет быстрее, чем обычный обмен с временной переменной, но я прошу с теоретической точки зрения. Если во время теста или собеседования кто-то просит меня написать функцию в C для обмена значениями для машины x86 без использования временной переменной, будет ли этот код действителен или это будет полный хрен? Спасибо вам.
Это - как вы сказали - дерьмо. Вы эффективно используете _two_ temps: регистры. Если собеседник задает вам этот вопрос, я убегу от этой компании. – Gene
Вы должны больше заботиться о написании чистого и обслуживаемого кода. Пусть компилятор выполнит свою работу, и если производительность _does_ станет профилем проблемы и оптимизируется как _necessary_. Если бы кто-то представил этот тип кода мне в интервью, он был бы направлен к ближайшему выходу. –
Ну, регистры являются временными переменными. –