针对非类型参数的特定值的模板代码优化

Template code optimization for specific values of non-type parameters.

本文关键字:代码优化 类型参数      更新时间:2023-10-16
template <bool flag>
class foo
{
    public:
        int bar()
        {
            if(flag)
            {
                // stuff
            }
        }
};

编译器编译此类时,会用true或false替换标志参数。然后我们有if(true((或if(false((。然后,if子句检查常量表达式,并将在编译时被删除。我能指望编译器的行为是这样的吗?

不,你不能。任何优化都完全取决于编译器。由于您使用的是模板,因此应该为flag的两种情况编写专门化。

优化是特定于编译器的。为什么不创建发布版本并逐步进行反汇编?

尽管如此,这不是一种惯用的方式。您应该使用模板专用化或方法重载。它们都提供编译时解析。因此,在这种情况下,我更喜欢后者:

#include <type_traits>
template <bool flag>
class foo
{
public:
    int bar()
    {
        _bar(std::integral_constant<bool, flag>())
    }
private:
    int _bar(std::true_type)
    {
        // stuff
    }
    int _bar(std::false_type)
    {
        // empty
    }
};

EDIT:这需要C++0x,但通过包含boost/type_traits并将std::指令更改为boost::,可以很容易地转换为C++98。当然,这将需要加强图书馆。

Expect,是的。Rely,没有。但是你怎么会注意到呢?

请注意,如果在if语句中编写代码,则无法使用false实例化模板。当flagfalse时,该语句无法编译。删除测试将由优化器完成,优化器在概念上是在编译器首先弄清楚代码的含义后运行的。