作者是对的,模板可能会产生所谓的代码膨胀,但他的解释是模糊的......
让我们从代码膨胀入门开始。
在 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
然而,一个实际问题是确定可以合并的此类功能,因为存在大量功能。
所以 ?如果希望限制生成的代码量,则只需限制实例化的数量。我发现作者声称图像处理例程可能需要其他类型的临时图像等可疑。程序中的类型集通常是相当有限的,并且没有数以万计的图像类型。