是这样的吗:
int val;
// ...
val = (val != 0) ? otherVal : 0;效率比这低:
int val;
//...
if (val != 0)
val = otherVal;编译器能够优化三元运算符吗?意图很明确,有没有可能想要真正将0写入内存?也许当内存被映射到一个文件时?
我们能假设这无关紧要吗?
编辑:关键是在满足某个条件的情况下将变量设置为某个值。没有其他想要的分支。这就是为什么我会问一个三元组(使用强制的else分支来制作副本)是否会降低效率或优化。
发布于 2013-05-23 00:30:56
Mats Petersson建议通常是最好的“编写最具可读性的变体”。但是,如果您正在尝试编写最佳速度性能代码,则需要了解有关您的计算机和处理器的更多信息。对于某些机器,第一个运行得更快(高度流水线处理器:没有分支,优化的三元运算符)。使用第二种形式(更简单),其他机器将运行得更快。
发布于 2013-05-23 00:26:39
您的编译器将对其进行优化。最后,在性能上几乎没有差别。
然而,在可读性方面有很大的不同。有时,三元运算符可以帮助删除许多代码行,这些代码行不会增加太多清晰度。
在其他情况下,if语句更清晰、更容易理解。
将代码简化为一个三元语句,但为了保持清晰,必须添加大量注释,这会适得其反。
以编程之神的名义,请不要嵌套三元语句。
发布于 2015-05-07 02:06:48
您可以使用无分支三元运算符,有时称为bitselect (条件?true : false)。
不要担心额外的操作,与if语句分支相比,它们算不了什么。
bitselect实现:
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);
}https://stackoverflow.com/questions/16696599
复制相似问题