【发布时间】:2012-12-11 15:37:26
【问题描述】:
考虑以下几点:
inline unsigned int f1(const unsigned int i, const bool b) {return b ? i : 0;}
inline unsigned int f2(const unsigned int i, const bool b) {return b*i;}
f2 的语法更紧凑,但标准是否保证f1 和f2 严格等价?
此外,如果我希望编译器在编译时知道b 和i 的情况下优化这个表达式,我应该更喜欢哪个版本?
【问题讨论】:
-
如果不指定哪个编译器,您将无法知道“编译器”将如何处理表达式(在编译时已知参数的情况下),但它很可能会优化两者。一种判断方法是,使用编译时已知的参数编译每个参数并检查输出。
-
查看生成的汇编代码
-
FWIW,MSVC 为第一种情况生成一个掩码并添加,为第二种情况生成一个乘法,在这种情况下我阻止它通过布尔值本身的评估来玩诡计(如果可以,它将更改产生布尔值的测试以进一步优化)。本质上,MSVC 在任何一种情况下都是无分支的,并且在幼稚的情况下似乎更优化。
-
您可以将
int和bool相乘。在较高的警告级别,您有时会收到性能警告。通常您将bool转换为int与!!:return (!!b)*i;。这将使编译器在抱怨时感到高兴。
标签: c++ boolean ternary-operator standards-compliance