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



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

template <int nSpectrumSamples>
class CoefficientSpectrum;
class RGBSpectrum : public CoefficientSpectrum<3> {
using CoefficientSpectrum<3>::c;
typedef RGBSpectrum Spectrum;
// typedef SampledSpectrum Spectrum;

作者说:

"我们编写的系统并没有让选择要使用的Spectrum实现可以在运行时解决;要切换到不同的表示,必须重新编译整个系统。这种设计的一个优点是,许多不同的Spectrume方法可以实现为编译器内联的短函数,而不是作为独立的函数必须通过相对较慢的虚拟方法调用机制调用的on。嵌入像这样经常使用的短函数可以大大提高性能。">

1.为什么模板可以内联函数,而普通方法不能?

2.为什么正常的方法必须使用虚拟方法?

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

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

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

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

最新更新