C++ C++;条件运算符与if-else

C++ C++;条件运算符与if-else,c++,conditional,operator-keyword,if-statement,C++,Conditional,Operator Keyword,If Statement,我一直在想这件事。假设我们有一个变量,字符串权重,和一个输入变量,int mode,可以是1或0 使用以下各项是否有明显的好处: weight = (mode == 1) ? "mode:1" : "mode:0"; 结束 超越代码可读性?速度是否受到影响,编译器是否以不同的方式处理(例如某些开关语句转换为跳转表的能力)?否,这纯粹是为了将代码呈现给人类读者。我希望任何编译器都能为这些代码生成相同的代码。不,这纯粹是为了将代码呈现给人类读者。我希望任何编译器都能为这些代码生成相同的代码。使用m

我一直在想这件事。假设我们有一个变量,字符串权重,和一个输入变量,int mode,可以是1或0

使用以下各项是否有明显的好处:

weight = (mode == 1) ? "mode:1" : "mode:0";
结束


超越代码可读性?速度是否受到影响,编译器是否以不同的方式处理(例如某些开关语句转换为跳转表的能力)?

否,这纯粹是为了将代码呈现给人类读者。我希望任何编译器都能为这些代码生成相同的代码。

不,这纯粹是为了将代码呈现给人类读者。我希望任何编译器都能为这些代码生成相同的代码。

使用mingw,使用

const char *  testFunc()
{
    int mode=1;
    const char * weight = (mode == 1)? "mode:1" : "mode:0";
    return weight;
}
是:

是:

testFunc():
0040138c:推送%ebp
0040138d:mov%esp,%ebp
0040138f:子$0x10,%esp
11 int模式=1;
00401392:movl$0x1,-0x8(%ebp)
12如果(模式==1)
00401399:cmpl$0x1,-0x8(%ebp)
0040139d:jne 0x4013a8
13 weight=“模式:1”;
0040139f:movl$0x403064,-0x4(%ebp)
004013a6:jmp 0x4013af
15 weight=“模式:0”;
004013a8:movl$0x40306b,-0x4(%ebp)
17返回重量;
004013af:mov-0x4(%ebp),%eax
18        }
生成的代码几乎相同。应用程序的性能不应该依赖于像这样的小细节


因此,不,这没有什么区别。

对于mingw,使用

const char *  testFunc()
{
    int mode=1;
    const char * weight = (mode == 1)? "mode:1" : "mode:0";
    return weight;
}
是:

是:

testFunc():
0040138c:推送%ebp
0040138d:mov%esp,%ebp
0040138f:子$0x10,%esp
11 int模式=1;
00401392:movl$0x1,-0x8(%ebp)
12如果(模式==1)
00401399:cmpl$0x1,-0x8(%ebp)
0040139d:jne 0x4013a8
13 weight=“模式:1”;
0040139f:movl$0x403064,-0x4(%ebp)
004013a6:jmp 0x4013af
15 weight=“模式:0”;
004013a8:movl$0x40306b,-0x4(%ebp)
17返回重量;
004013af:mov-0x4(%ebp),%eax
18        }
生成的代码几乎相同。应用程序的性能不应该依赖于像这样的小细节


因此,不,它没有区别。

条件运算符和if/else块之间的关键区别在于条件运算符是表达式,而不是语句。因此,很少有地方可以使用条件运算符而不能使用if/else。例如,常量对象的初始化,如下所示:

const double biasFactor = (x < 5) ? 2.5 : 6.432;
在这种情况下,myData可能没有定义任何赋值运算符或非常量成员函数——其构造函数可能是向其传递任何参数的唯一方法


另外,请注意,任何表达式都可以通过在末尾添加分号转换为语句,反之亦然。

条件运算符和if/else块之间的关键区别在于,条件运算符是表达式,而不是语句。因此,很少有地方可以使用条件运算符而不能使用if/else。例如,常量对象的初始化,如下所示:

const double biasFactor = (x < 5) ? 2.5 : 6.432;
在这种情况下,myData可能没有定义任何赋值运算符或非常量成员函数——其构造函数可能是向其传递任何参数的唯一方法


另外,请注意,任何表达式都可以通过在末尾添加分号来转换为语句,反之亦然。

通过
gcc-s
输出检查它们中的每一个。通过
gcc-s
输出检查它们中的每一个。看起来您在编译时没有进行优化(帧仍然存在,变量不在寄存器内)。即使未优化的代码会有所不同,但如果优化的代码会有所不同,这确实很重要。(至于性能,这取决于应用程序。在大多数应用程序中,它并不存在,但在一些优化的最内部循环中,更快地执行ns可以转化为实际的金钱).关于仅仅基于这么小的东西的性能,你是对的。但是,我问你,因为获得许多小的性能提升可能会导致更大的性能提升。@CollinBiedenkapp:我愿意说,这将导致相同的代码。我对HPC和驱动程序有点偏爱,内环中的一些小改进可以让计算机比如说运行快几天-但是在这种情况下,您首先考虑算法(这里是99%的情况应该停止的地方),然后是架构优化(缓存效率等),最后是指令调度。编译器的情况正好相反-最后一个可以由它们高效完成(使用
-Ox
等)还有架构优化的研究/测试版实现。(续)也就是说——我不知道如何有效地推理大多数处理器使用的超标量无序架构(编译器在这方面比我强得多)——如果抛出多线程处理器,我会完全不知所措(即连字符线程)。在做任何事情之前,请检查a)速度是否足够好(改进是否证明成本合理)b)代码中的瓶颈是什么c)瓶颈的原因是什么(内存、cpu等)d)可以进行优化的最高级别是什么。看起来您在编译时没有进行优化(帧仍然存在,变量不在寄存器内)。即使未优化的代码会有所不同,但如果优化的代码会有所不同,这确实很重要。(至于性能,这取决于应用程序。在大多数应用程序中,它并不存在,但在一些优化的最内部循环中,更快地执行ns可以转化为实际的金钱).关于仅仅基于这么小的东西的性能,你是对的。但是,我问你,因为获得许多小的性能提升可能会导致更大的性能提升。@CollinBiedenkapp:我愿意说,这将导致相同的代码。我对HPC和驱动程序有点偏爱,内环中的一些小改进可以让计算机但是,在这种情况下,你首先考虑的是算法(这里是99%的情况应该停止的地方),然后是
testFunc():
0040138c:   push %ebp
0040138d:   mov %esp,%ebp
0040138f:   sub $0x10,%esp
11          int mode=1;
00401392:   movl $0x1,-0x8(%ebp)
12          if(mode == 1)
00401399:   cmpl $0x1,-0x8(%ebp)
0040139d:   jne 0x4013a8 <testFunc()+28>
13              weight = "mode:1";
0040139f:   movl $0x403064,-0x4(%ebp)
004013a6:   jmp 0x4013af <testFunc()+35>
15              weight = "mode:0";
004013a8:   movl $0x40306b,-0x4(%ebp)
17          return weight;
004013af:   mov -0x4(%ebp),%eax
18        }
const double biasFactor = (x < 5) ? 2.5 : 6.432;
X::X()
  : myData(x > 5 ? 0xCAFEBABE : OxDEADBEEF)
{
}