【发布时间】:2019-04-30 02:21:43
【问题描述】:
我正在阅读 pbrt,它定义了一个类型:
template <int nSpectrumSamples>
class CoefficientSpectrum;
class RGBSpectrum : public CoefficientSpectrum<3> {
using CoefficientSpectrum<3>::c;
typedef RGBSpectrum Spectrum;
// typedef SampledSpectrum Spectrum;
而作者说:
“我们没有编写系统,以便可以在运行时解决使用哪个 Spectrum 实现的选择;要切换到不同的表示,必须重新编译整个系统。这种设计的一个优点是许多各种 Spectrum 方法可以实现为可以由编译器内联的短函数,而不是作为必须通过相对较慢的虚方法调用机制调用的独立函数。内联这些常用的短函数可以给出性能大幅提升。”
1.为什么模板可以内联函数而普通方式不能?
2.为什么普通方式必须使用虚方式?
链接到整个头文件: https://github.com/mmp/pbrt-v3/blob/master/src/core/spectrum.h
【问题讨论】:
-
C++ 支持静态(编译时)和动态(运行时)多态性。前者作为模板,后者作为具有虚拟成员函数的类。两者都有其优点/缺点。静态多态性必须在编译时解决(缺点),但不受虚函数运行时开销的影响(优点)。对于该库的作者来说,性能可能比运行时灵活性更重要,因此他们决定选择静态多态性。
-
还要注意动态分配与问题无关。
-
感谢您的注意,Max.Actually,我错过了报价的一部分。 >第二个优点是系统中保存 Spectrum 类型实例的结构可以直接保存它们,而不需要根据运行时选择的谱表示动态分配它们。
-
@Y.Lex 动态多态性通常通过基类指针实现,您可以在其中存储派生类的动态分配实例的地址。