gpt4 book ai didi

c++ - 模板类中的内联虚方法

转载 作者:行者123 更新时间:2023-11-28 06:21:44 25 4
gpt4 key购买 nike

我有一个带有 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 是模板函数,因此它们位于头文件中,该头文件包含在使用这些类的每个翻译单元中。这意味着编译器应该知道支持内联所需的一切(据我所知,因为它不需要单独编译)。我试过了,基本上这个函数没有内联,它不会带来任何真正的性能优势(除了函数调用开销,我认为流水线也被破坏了)。有没有办法支持这种情况的内联?或者有什么建议可以实现这种事情吗?

最佳答案

在虚拟方法的情况下,内联没有实际意义(因为您需要运行时信息来决定将哪些代码用于内联),因此编译器会从此类代码中生成“正常”方法,并“定期”调用它们。

关于c++ - 模板类中的内联虚方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29199096/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com