3

if else (またはその逆) よりも三項演算子を使用することのパフォーマンスまたはメモリに関する利点はありますか? たとえば、以下のケースです。

int x=0, y=1, z=2, a=0;
a= x ? y : z;

別:

if ( x != 0 ){
    a = y;
}else{
    a = z;
}
4

5 に答える 5

5

両方のアプローチの逆アセンブルを見ると、私が知っている最新のコンパイラでは一般的に同じです。三項演算子は、同じことをコンパクトに書いたものです。

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 つの異なるレジスタに追加し、比較し、比較結果に基づいてジャンプします。

于 2013-09-12T14:48:49.907 に答える
4

コンパイラは通常、両方を同じ命令に最適化するのに十分スマートです。コンパイラの最適化を想定せずに三項演算子を使用することをお勧めします。

于 2013-09-12T14:48:48.827 に答える
2

最近のコンパイラでは、通常、これら 2 つの間に違いはありません。

したがって、コードの可読性と保守性の問題にすぎません。

于 2013-09-12T14:50:02.047 に答える
2

唯一の「利点」は、式 (関数の引数など) で三項演算子を使用して、より簡潔なコードを作成できることです。を使用するifと、式全体が複製されます。

于 2013-09-12T14:51:33.370 に答える
1

特定の状況で最も読みやすい方を使用してください。

パフォーマンスの問題があることを測定した場合にのみ、効率について心配してください。

おそらく、コンパイラは同じコードを生成します。

于 2013-09-12T14:48:28.593 に答える