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

时间:2013-08-05 06:19:04

标签: c++ templates

我正在阅读有关C ++书籍中的模板,如下所述

  

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

     

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

我对上述文字的疑问

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

  2. 作者的意思是“不必模板化对象的优点是可以让我们控制对象的编译方式”?

  3. 请求您帮助理解上述陈述。如果用简单的例子解释会很好。

    感谢您的时间和帮助。

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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

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

然而,实际问题是识别可以合并的功能,只要有大量的功能。


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