模板中的编译控制和代码膨胀

compilation control and code bloat in templates

本文关键字:代码 膨胀 控制 编译      更新时间:2023-10-16

我正在阅读应用C++书中的模板,下面提到了

模板创建代码膨胀。编译器将实例化一个模板对象。即使您的用户只需要有限的类型,图像处理例程可能需要用于临时图像等。

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

我对以上文本的问题

  1. 作者所说的"即使您的用户只需要有限的类型,图像处理例程也可能需要临时图像等的额外类型"是什么意思?

  2. 作者所说的"不必模板化对象的优点是让我们可以控制如何编译对象"是什么意思?

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

谢谢你的时间和帮助。

作者是对的,模板可能会创建所谓的代码膨胀,但他的解释是模糊的。。。

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

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

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

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

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

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

然而,一个实际的问题是,考虑到函数的数量,确定可以合并的函数。


那么呢?如果希望限制生成的代码量,只需要限制实例化的数量。我发现作者声称图像处理例程可能需要额外类型的临时图像等等是可疑的。程序中的类型集通常受到相当大的限制,并且没有大量的图像类型。