模板类中的内联虚方法

时间:2015-03-22 19:50:56

标签: c++ templates inline virtual-functions

我有一个模板基类,其get_p_pow方法由foo函数调用:

template <typename T_container> 
class base {    
    public:
    int foo() {
        ...
        get_p_pow(p_pow, delta_p);
        ...
    }

    ...

    protected:            
        virtual T_container& get_p_pow(T_container &p_pow, double delta_p) const {
            p_pow(0) = 1.0;
            p_pow(1) = delta_p;
            for (difference_type i = 2; i <= order; ++i) {
                p_pow(i) *= p_pow(i-1)*delta_p; 
            }

            return p_pow;
        }

    int order;
};   

对于某些派生类,order的值设置为特定的数字,因此我可以展开循环,希望foo调用并内联展开的版本:

template <typename T_container> 
class child : public base<T_container> {   
    ... 
    protected:            
        T_container& get_p_pow(T_container &p_pow, double delta_p) const {
            p_pow(0) = 1.0;
            p_pow(1) = delta_p;
            p_pow(2) = p_pow(1)*delta_p;
            p_pow(3) = p_pow(2)*delta_p;
            p_pow(4) = p_pow(3)*delta_p;
            p_pow(5) = p_pow(4)*delta_p;

            return p_pow;
        }
    // order set to 5 in constructor
};  

问题是,我知道虚函数,大部分时间都不能内联,除非编译器具有该对象的特定实例,而不是指针/引用它。但是,由于basechild是模板函数,因此它们位于头文件中,该文件包含在使用这些类的每个翻译单元中。这意味着编译器应该知道它需要的所有内容以支持内联(据我所知,因为它不需要单独的编译)。我已经尝试过了,基本上没有内联函数,并且它没有带来任何真正的性能优势(除了函数调用开销,我认为流水线也被破坏了)。有没有办法支持内联这种情况?或者有任何建议来实现这种事情吗?

1 个答案:

答案 0 :(得分:1)

如果虚拟方法内联没有任何意义(因为您需要运行时信息确定用于内联的代码),因此编译器会从这些代码生成“正常”方法,并“定期”调用它们。