【发布时间】:2011-08-19 21:45:05
【问题描述】:
对于现代硬件上的典型现代编译器,? : 运算符会导致影响指令管道的分支吗?
换句话说更快,调用这两种情况以避免可能的分支:
bool testVar = someValue(); // Used later.
purge(white);
purge(black);
或者选择一个真正需要被清除的并且只使用操作员?::
bool testVar = someValue();
purge(testVar ? white : black);
我知道您不知道 purge() 需要多长时间,但我只是在这里问一个一般性问题,即我是否想调用 purge() 两次以避免代码中可能出现的分支。
我意识到这是一个非常小的优化,可能没有真正的区别,但仍然想知道。我希望?: 不会导致分支,但想确保我的理解是正确的。
【问题讨论】:
-
我很确定函数调用会比分支更昂贵,但我知道的不足以支持它并将其作为答案发布。你为什么不同时尝试和配置文件?
-
仅供参考,
?:被称为 三元 运算符。 -
你为什么不用你的编译器试试看呢?看看生成的汇编代码就行了。
-
@Jared Ng - 不完全是。三元运算符是具有三个操作数的任何运算符。大多数语言只有一个三元运算符 -
?:- 但有些(某处)有其他运算符。三元类似于二元或一元。?:是 a 三元运算符,但它的名字是 conditional 运算符。 -
@GMan - 我假设(因为 OP 似乎暗示任何一个选项都是可以接受的)
purgeing 可能不需要的东西是 nop(也许不在程序集中,但实际上)。
标签: c++ compiler-construction hardware micro-optimization