如果您使用 gcc 并且-Wall
编译器已经警告您
ac:3:26:警告:对“b”的操作可能未定义 [-Wsequence-point]
从性能的角度来看,是否使用这样的结构也是值得商榷的。当你看
void swap1(int *a, int *b)
{
*a = (*a + *b) - (*b = *a);
}
void swap2(int *a, int *b)
{
int t = *a;
*a = *b;
*b = t;
}
并检查汇编代码
swap1:
.LFB0:
.cfi_startproc
movl (%rdi), %edx
movl (%rsi), %eax
movl %edx, (%rsi)
movl %eax, (%rdi)
ret
.cfi_endproc
swap2:
.LFB1:
.cfi_startproc
movl (%rdi), %eax
movl (%rsi), %edx
movl %edx, (%rdi)
movl %eax, (%rsi)
ret
.cfi_endproc
您看不到混淆代码的任何好处。
查看 C++ (g++) 代码,它的功能基本相同,但考虑move
到
#include <algorithm>
void swap3(int *a, int *b)
{
std::swap(*a, *b);
}
给出相同的汇编输出
_Z5swap3PiS_:
.LFB417:
.cfi_startproc
movl (%rdi), %eax
movl (%rsi), %edx
movl %edx, (%rdi)
movl %eax, (%rsi)
ret
.cfi_endproc
考虑到 gcc 的警告并且没有看到任何技术收益,我会说,坚持使用标准技术。如果这成为瓶颈,您仍然可以调查如何改进或避免这一小段代码。