C++使用模板来避免编译器检查布尔值

ise*_*sky 18 c++ templates boolean

假设我有一个功能:

template <bool stuff>
inline void doSomething() {
    if(stuff) {
        cout << "Hello" << endl;
    }
    else {
        cout << "Goodbye" << endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

我称之为:

doSomething<true>();
doSomething<false>();
Run Code Online (Sandbox Code Playgroud)

它会引出:

Hello
Goodbye
Run Code Online (Sandbox Code Playgroud)

我真正想知道的是编译器是否完全优化了这一点?当我用temp调用模板化函数时,它会创建一个只输出"Hello"并避免if语句和"Goodbye"代码的函数吗?

这对于我刚刚编写的一个巨大的函数非常有用,它应该是非常优化的,并尽可能避免尽可能多的不必要的语句检查.我有一种非常好的感觉,至少在发布版本中有优化,如果没有在没有优化的调试版本中.

Ger*_*s R 14

免责声明:没有人可以保证任何事情.

也就是说,这对任何编译器来说都是一个明显而简单的优化 可以很自然地说它会被优化掉,除非优化器实际上没用.

由于你的"true"和"false"是常量,你明确地在每个类中创建一个明显的死分支,编译器应该优化它.字面意思应该在这里 - 如果"优化"编译器没有执行死分支删除,我认为这是一个主要的主要问题.

换句话说,如果您的编译器无法对此进行优化,则应使用应该进行评估的编译器,而不是代码.

所以,我会说你的直觉是正确的:虽然是,但是在每个编译器上都没有"保证",我不会使用无法在任何生产环境中执行简单优化的编译器,当然也不会任何表现至关重要的.(当然是在发布版本中).

所以,使用它.任何现代优化编译器都会优化它,因为它是一个简单的优化.如果有疑问,请检查反汇编,如果未进行优化,请将编译器更改为更现代的版本.

通常,如果您正在编写任何类型的性能关键代码,则必须至少在某种程度上依赖于编译器优化.


Seb*_*ann 1

事实上,它确实创建了两个功能,但是

过早的优化是万恶之源

特别是如果您因为一个简单的 if 语句而更改代码结构。我怀疑这会影响性能。此外,布尔值必须是静态的,这意味着您不能采用运行时评估的 var 并将其传递给函数。链接器应该如何知道要调用哪个函数?在这种情况下,您必须手动评估它并自行调用适当的函数。