if else (またはその逆) よりも三項演算子を使用することのパフォーマンスまたはメモリに関する利点はありますか? たとえば、以下のケースです。
int x=0, y=1, z=2, a=0;
a= x ? y : z;
別:
if ( x != 0 ){
a = y;
}else{
a = z;
}
if else (またはその逆) よりも三項演算子を使用することのパフォーマンスまたはメモリに関する利点はありますか? たとえば、以下のケースです。
int x=0, y=1, z=2, a=0;
a= x ? y : z;
別:
if ( x != 0 ){
a = y;
}else{
a = z;
}
両方のアプローチの逆アセンブルを見ると、私が知っている最新のコンパイラでは一般的に同じです。三項演算子は、同じことをコンパクトに書いたものです。
Mac OS X で gcc 4.2.1 を使用した例を次に示します。
if/else を使用:
int x = 1;
int y = 2;
int z;
if (x < y)
{
z = 3;
}
else
{
z = 4;
}
三項演算子の場合:
int x = 1;
int y = 2;
int z = (x < y) ? 3 : 4;
これらの両方で gcc -S test.c を実行すると、if/else バージョンの次のアセンブリが得られます。
movl $1, -16(%rbp)
movl $2, -20(%rbp)
movl -16(%rbp), %eax
movl -20(%rbp), %ecx
cmpl %ecx, %eax
jge LBB1_2
movl $3, -12(%rbp)
jmp LBB1_3
LBB1_2:
movl $4, -12(%rbp)
三項演算子バージョンの場合:
movl $1, -12(%rbp)
movl $2, -16(%rbp)
movl -12(%rbp), %eax
movl -16(%rbp), %ecx
cmpl %ecx, %eax
jge LBB1_2
movl $3, -20(%rbp)
jmp LBB1_3
LBB1_2:
movl $4, -20(%rbp)
レジスタ オフセットは異なりますが、機能的には、コードは同じことを行います。2 つのリテラルを 2 つの異なるレジスタに追加し、比較し、比較結果に基づいてジャンプします。
コンパイラは通常、両方を同じ命令に最適化するのに十分スマートです。コンパイラの最適化を想定せずに三項演算子を使用することをお勧めします。
最近のコンパイラでは、通常、これら 2 つの間に違いはありません。
したがって、コードの可読性と保守性の問題にすぎません。
唯一の「利点」は、式 (関数の引数など) で三項演算子を使用して、より簡潔なコードを作成できることです。を使用するif
と、式全体が複製されます。
特定の状況で最も読みやすい方を使用してください。
パフォーマンスの問題があることを測定した場合にのみ、効率について心配してください。
おそらく、コンパイラは同じコードを生成します。