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 の警告を考慮に入れても、技術的な利点が見られない場合は、標準的な手法を使用することをお勧めします。これがボトルネックになった場合でも、この小さなコードを改善または回避する方法を調査できます。