gpt4 book ai didi

c++ - 对非内联基类函数的内联调用(这到底是什么意思)?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:05:40 25 4
gpt4 key购买 nike

我正在通读一本 C++ 书籍,并且正在阅读有关减少模板生成的目标代码的部分(Scott Meyers 着的 Effective C++ III)。它给出的示例之一是:

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()); }

... functions ...

private:
boost::scoped_array<T> pData;
};

基类 SquareMatrixBase 有一个函数叫做:

void invert(std::size_t matrixSize);

"The book moves on to say "Regardless of where the data is stored, the key result from a bloat point of view is that now many -- maybe all -- of SquareMatrix's member functions can be simple inline calls to non-inline base class versions that are shared with all other matrices holding the same type of data, regardless of their size."

“对非内联基类版本的内联调用……”是什么意思?如果它是一个内联调用,我会认为它会将任何函数的整个基类版本放入使用内联的地方,但这会导致我认为相同的代码膨胀。它说这就像它有利于防止代码膨胀。

如果您需要更多背景信息,请告诉我,虽然这些章节很长,但我非常努力地提供背景信息,但我可能遗漏了一些内容。

||编辑 - 附加信息||

在这段话中使用方阵和方阵基的目的是:

SquareMatrix 最初是一个独立的模板(不是派生的)。它包含一系列函数,这些函数根据模板参数 n 的值进行操作。因此,对于使用的每个 n 值(或使用的每对 n,T),每个函数基本上都有一个拷贝,因为为每个参数对实例化了具有这些函数的新模板。 SquareMatrixBase 的创建是为了将依赖于大小参数的函数移动到基类。由于基类仅使用类型参数(而不是大小)实例化,因此可以通过将派生类传递给基类构造函数的大小值传递给基类中的函数来调用。这意味着无论传入的 std::size_t n 是什么,传入 SquareMatrix 模板的每个类型名称 T 的函数只有一个版本(相对于 {T, n} 的每个组合的每个函数的一个版本。

最佳答案

重点是 SquareMatrix::invert() 是内联的,因此该函数甚至不会出现在结果代码中,而是 protected 基函数 SquareMatrixBase::invert( n) 直接调用。

现在由于该函数内联,因此该函数只有一个实例(对于每种类型T),而不是针对每种大小n。这与单类设计形成鲜明对比,在单类设计中,invert() 函数将为 n 的每个值实例化 p>

关于c++ - 对非内联基类函数的内联调用(这到底是什么意思)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7741346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com