2

我正在阅读应用 C++ 书中的模板,如下所述

模板会造成代码膨胀。编译器将为每个像素类型实例化一个模板对象。即使您的用户只需要有限的类型,图像处理例程也可能需要其他类型的临时图像等。

不必模板化对象的优点是让我们可以控制如何编译对象,并让我们控制代码膨胀。

我对上述文字的问题

  1. 作者的意思是“即使您的用户只需要有限的类型,图像处理例程也可能需要临时图像等的附加类型”。?

  2. 作者所说的“不必模板化对象具有让我们控制如何编译对象的优势”是什么意思?

请求您帮助理解上述陈述。如果用简单的例子来解释就好了。

感谢您的时间和帮助。

4

1 回答 1

2

作者是对的,模板可能会产生所谓的代码膨胀,但他的解释是模糊的......

让我们从代码膨胀入门开始。

在 C++ 标准中,模板和函数指针之间存在令人讨厌的交互:

  • 具有给定参数集的模板的每个实例化都是它自己的类型
  • 两个不同的函数应该有不同的地址

由于两个不同的实例化(例如一个 withint和一个 with long)是不同的类型,与它们关联的函数是不同的函数,因此它们需要不同的地址。

允许优化编译器在 as-if 规则下实际合并函数:如果程序员无法意识到它们已合并。天真的尝试是试图证明其中一个的地址从未被占用,这是徒劳的。一个更聪明的策略是合并函数体,但仍然提供不同的地址:

; assembly-like code
function_instantiation_1:
    nop                   ; offset to have different addresses
function_instantiation_2:
                          ; body of both functions

然而,一个实际问题是确定可以合并的此类功能,因为存在大量功能。


所以 ?如果希望限制生成的代码量,则只需限制实例化的数量。我发现作者声称图像处理例程可能需要其他类型的临时图像等可疑。程序中的类型集通常是相当有限的,并且没有数以万计的图像类型。

于 2013-08-05T06:53:02.420 回答