假设我有一个函数:
template <bool stuff>
inline void doSomething() {
if(stuff) {
cout << "Hello" << endl;
}
else {
cout << "Goodbye" << endl;
}
}
我这样称呼它:
doSomething<true>();
doSomething<false>();
它会打印出:
Hello
Goodbye
我真正想知道的是编译器是否完全优化了这一点?
当我使用 true 调用模板化函数时,它会创建一个仅输出“Hello”并避免 if 语句和“Goodbye”代码的函数吗?
这对于我刚刚编写的这个巨大函数非常有用,该函数应该非常优化,并尽可能避免不必要的 if 语句检查。我有一种非常好的感觉,至少在具有优化的发布版本中会如此,如果不是在没有优化的调试版本中的话。
免责声明:没有人可以保证任何事情。
也就是说,这对于任何编译器来说都是明显且简单的优化。可以肯定地说,它将被优化掉,除非优化器实际上毫无用处。
由于“true”和“false”是常量,因此您在每个类中明确创建了一个明显的死分支,编译器应该将其优化掉。这里的“应该”是字面上的意思——如果“优化”编译器没有删除死分支,我会认为这是一个非常非常大的问题。
换句话说,如果您的编译器无法对此进行优化,则应该评估该编译器的使用,而不是代码。
所以,我想说你的直觉是正确的:虽然是的,不能对每个编译器做出这样的“保证”,但我不会使用无法在任何生产环境中执行简单优化的编译器,当然也不会在任何性能关键的一个。 (当然是在发布版本中)。
所以,使用它。任何现代优化编译器都会优化它,因为这是一个微不足道的优化。如果有疑问,请检查反汇编,如果未优化,请将编译器更改为更现代的编译器。
一般来说,如果您正在编写任何类型的性能关键型代码,则必须至少在某种程度上依赖编译器优化。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)