首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >三元运算符vs if语句:编译器优化

三元运算符vs if语句:编译器优化
EN

Stack Overflow用户
提问于 2013-05-23 00:06:30
回答 5查看 7.3K关注 0票数 7

是这样的吗:

代码语言:javascript
复制
int val;  
// ...
val = (val != 0) ? otherVal : 0;

效率比这低:

代码语言:javascript
复制
int val;
//...
if (val != 0)
    val = otherVal;

编译器能够优化三元运算符吗?意图很明确,有没有可能想要真正将0写入内存?也许当内存被映射到一个文件时?

我们能假设这无关紧要吗?

编辑:关键是在满足某个条件的情况下将变量设置为某个值。没有其他想要的分支。这就是为什么我会问一个三元组(使用强制的else分支来制作副本)是否会降低效率或优化。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-05-23 00:30:56

Mats Petersson建议通常是最好的“编写最具可读性的变体”。但是,如果您正在尝试编写最佳速度性能代码,则需要了解有关您的计算机和处理器的更多信息。对于某些机器,第一个运行得更快(高度流水线处理器:没有分支,优化的三元运算符)。使用第二种形式(更简单),其他机器将运行得更快。

票数 5
EN

Stack Overflow用户

发布于 2013-05-23 00:26:39

您的编译器将对其进行优化。最后,在性能上几乎没有差别。

然而,在可读性方面有很大的不同。有时,三元运算符可以帮助删除许多代码行,这些代码行不会增加太多清晰度。

在其他情况下,if语句更清晰、更容易理解。

将代码简化为一个三元语句,但为了保持清晰,必须添加大量注释,这会适得其反。

以编程之神的名义,请不要嵌套三元语句。

票数 4
EN

Stack Overflow用户

发布于 2015-05-07 02:06:48

您可以使用无分支三元运算符,有时称为bitselect (条件?true : false)。

不要担心额外的操作,与if语句分支相比,它们算不了什么。

bitselect实现:

代码语言:javascript
复制
inline static int bitselect(int condition, int truereturnvalue, int falsereturnvalue)
{
    return (truereturnvalue & -condition) | (falsereturnvalue & ~(-condition)); //a when TRUE and b when FALSE
}

inline static float bitselect(int condition, float truereturnvalue, float falsereturnvalue)
{
    //Reinterpret floats. Would work because it's just a bit select, no matter the actual value
    int& at = reinterpret_cast<int&>(truereturnvalue);
    int& af = reinterpret_cast<int&>(falsereturnvalue);
    int res = (at & -condition) | (af & ~(-condition)); //a when TRUE and b when FALSE
    return  reinterpret_cast<float&>(res);
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16696599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档