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)

寄存器偏移量不同,但在功能上,代码做同样的事情。它将两个文字添加到两个不同的寄存器,然后根据比较结果进行比较和跳转。

于 2013-09-12T14:48:49.907 回答
4

编译器通常足够聪明,可以将两者优化为相同的指令。最好在不假设编译器优化的情况下使用三元运算符。

于 2013-09-12T14:48:48.827 回答
2

唯一的“优点”是您可以在表达式中使用三元运算符(例如函数参数),从而获得更简洁的代码。使用if,您将复制完整的表达式。

于 2013-09-12T14:51:33.370 回答
2

在任何现代编译器上,这两者之间通常没有区别。

因此,这只是代码的可读性和可维护性的问题。

于 2013-09-12T14:50:02.047 回答
1

在您的特定情况下使用最易读的那个。

只有当您测量出您有性能问题时才担心效率。

编译器很可能会生成相同的代码。

于 2013-09-12T14:48:28.593 回答