使用模板<int size>比使用动态分配有什么好处?

Y.L*_*Lex 5 c++ render c++11 pbrt

我正在阅读pbrt,它已经定义了一个类型:

template <int nSpectrumSamples>
class CoefficientSpectrum;
class RGBSpectrum : public CoefficientSpectrum<3> {
    using CoefficientSpectrum<3>::c;
typedef RGBSpectrum Spectrum;
// typedef SampledSpectrum Spectrum;
Run Code Online (Sandbox Code Playgroud)

作者说:

"我们还没有编写系统,以便在运行时选择使用哪种Spectrum实现;要切换到不同的表示,必须重新编译整个系统.这种设计的一个优点是许多不同的频谱方法可以实现为可由编译器内联的短函数,而不是作为必须通过相对较慢的虚方法调用机制调用的独立函数.内联常用的短函数可以带来实质性的改进表现."

1.为什么模板可以内联功能但正常方式不能?

2.为什么常规方法必须使用虚方法?

链接到整个头文件:https: //github.com/mmp/pbrt-v3/blob/master/src/core/spectrum.h

Max*_*hof 7

要内联函数调用,编译器必须知道1.调用哪个函数,以及2.该函数的确切代码.virtual函数的整个目的是将选择哪个函数推迟到运行时,因此编译器只能使用需要非常特定情况的复杂优化技术来获取上述信息1.

模板和虚函数(即多态)都是编码抽象的工具.使用a的代码CoefficientSpectrum并不真正关心频谱的实现细节,只有你可以将其转换为RGB和从RGB转换 - 这就是为什么它使用抽象(避免重复每种频谱的代码).正如你引用的评论中所解释的那样,在这里使用多态进行抽象意味着编译器很难优化代码,因为它从根本上将实现的选择推迟到运行时(这有时是有用的,但在这里并不是非常必要).通过要求在编译时选择实现,编译器可以轻松地优化(即内联)代码.

1例如,一些编译器能够优化std::function抽象,这通常使用多态来进行类型擦除.当然,这只有在获得所有必要信息的情况下才有效.