我有一个模板基类,其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
};
问题是,我知道虚函数,大部分时间都不能内联,除非编译器具有该对象的特定实例,而不是指针/引用它。但是,由于base
和child
是模板函数,因此它们位于头文件中,该文件包含在使用这些类的每个翻译单元中。这意味着编译器应该知道它需要的所有内容以支持内联(据我所知,因为它不需要单独的编译)。我已经尝试过了,基本上没有内联函数,并且它没有带来任何真正的性能优势(除了函数调用开销,我认为流水线也被破坏了)。有没有办法支持内联这种情况?或者有任何建议来实现这种事情吗?
答案 0 :(得分:1)
如果虚拟方法内联没有任何意义(因为您需要运行时信息确定用于内联的代码),因此编译器会从这些代码生成“正常”方法,并“定期”调用它们。