来自 Scott Meyers 的 Effective C++:
template<typename T, std::size_t n>
class SquareMatrix: private SquareMatrixBase<T> {
public:
SquareMatrix( )
: SquareMatrixBase<T>(n, 0),
pData(new T[n*n])
{
this->setDataPtr(pData.get());
}
...
private:
boost::scoped_array<T> pData;
};
无论数据存储在哪里,从膨胀的角度来看,关键结果是现在 SquareMatrix 的许多(可能是全部)成员函数可以是对基类版本的简单内联调用,这些版本与所有其他持有相同类型的矩阵的矩阵共享数据,不管它们的大小。同时,不同大小的 SquareMatrix 对象是不同的类型,因此即使 SquareMatrix<double, 5> 和 SquareMatrix<double, 1 0> 对象在 SquareMatrixBase<double> 中使用相同的成员函数,也不可能将 SquareMatrix<double, 5> 对象传递给需要 SquareMatrix<double, 1 0> 的函数。不错,不是吗?
不错,是的,但不是免费的。与将大小作为函数参数传递或存储在对象中的共享版本相比,硬连线到其中的矩阵大小的 invert 版本可能会生成更好的代码。例如,在特定于大小的版本中,大小将是编译时常量,因此有资格进行诸如常量传播之类的优化,包括将它们作为立即操作数折叠到生成的指令中。这不能在与大小无关的版本中完成。
在上一段的上述描述中,它被提及为“因此有资格进行诸如常量传播之类的优化,包括将它们作为直接操作数折叠到生成的指令中”。这个说法是什么意思?请要求解释这一点。
谢谢!