了解模板代码膨胀
Understanding template code bloat
我正在阅读Scott Meyers C++,并发现了所谓的代码膨胀的概念。他提供了一个如何通过继承来减少它的例子:
template <typename T>
class SquareMatrixBase{
protected:
void invert(std::size_t matrixSize); // <------------ HERE
}
template <typename T, std::size_t n>
class SquareMatrix : private SquareMatrixBase<T>{
private:
using SquareMatrix<T>::invert;
public:
void invert(){ invert(n) }
}
现在,在项目摘要中,他指出
模板生成多个类和多个函数,因此不依赖于模板参数的模板代码会导致膨胀。
因此,在这个例子中,我们有SquareMatrixBase<T>::invert(std::size_t)
,它不依赖于模板参数。因此,它会导致代码膨胀。这不是我们试图消除的东西吗?我错过了什么?
因此,在这个例子中,我们有
SquareMatrixBase<T>::invert(std::size_t)
,它不依赖于模板参数。因此,它会导致代码膨胀。这不是我们试图消除的东西吗?我错过了什么?
没有。您忽略了invert
对矩阵执行的操作将依赖于T
,因此为每个T
实例化一个invert
是合适的。
对于类型T
和矩阵大小n
的每个组合都有一个实例化是不可取的,这就是为什么基于这两个参数模板化的派生SquareMatrix
类服从基类的实现。它实际上只是将矩阵大小常量作为运行时值注入。
由于SquareMatrix
模板是在T
和n
这两个对象上参数化的,因此即使您可能具有相同的类型T
,如果您具有不同的n
,并且invert
是SquareMatrix
的成员函数,它也会导致函数的多个版本(这个数字取决于我们实例化的具有相同T
但不同大小的SquareMatrix
的数量)。
Scott正在演示我们如何通过简单地继承仅在T
上参数化的类型来避免由这些多个副本引起的潜在膨胀,因此无论n
的值如何,都可以共享invert
的实现。
他在运行时将size值传递给基类函数,因此所有相同的信息都可用于该函数。
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 添加虚拟析构函数会使代码大小膨胀
- 考虑到今天的处理器,代码膨胀是否不再重要?
- 模板代码因unordered_map而膨胀
- 不使用模板参数的函数使过多的代码膨胀?
- 了解模板代码膨胀
- 模板中的编译控制和代码膨胀
- 使用GCC/CLANG跟踪代码膨胀的工具
- 使用 std::array<T, N> 会导致代码膨胀吗?