我一直在阅读有关交换变量内容而不使用临时变量的内容,除了着名的xor算法,我还发现了x86上汇编的XCHG指令.所以我写了这段代码:
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)
);}
Run Code Online (Sandbox Code Playgroud)
它确实有效但后来我意识到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)
);}
Run Code Online (Sandbox Code Playgroud)
第二个函数也可以,但似乎没有人提到使用寄存器交换变量,所以这段代码被认为是错误的,实际上它并没有真正正常工作?我错过了什么吗?
我意识到这只适用于x86,但由于大多数人拥有intel x86处理器,这个代码可以用于任何现实世界的编程吗?我意识到这可能不会比使用临时变量的常规交换更快,但我从理论的角度来问.如果在测试或面试期间有人要求我在C中编写一个函数来交换x86机器的值而不使用临时变量,那么这段代码是有效还是完全废话?谢谢.
有效,是的.根据我的标准,你是一个不雇用的人.
为什么?成本.
std :: swap可以很好地完成工作,并且可能足够快.您的代码将具有更高的维护成本.
由于性能原因,肯定有时候会进入汇编程序.
这不是其中的一个.
归档时间: |
|
查看次数: |
492 次 |
最近记录: |