我正在阅读有关C ++书籍中的模板,如下所述
模板创建代码膨胀。编译器将实例化一个模板 每个像素类型的对象。即使您的用户只需要有限 类型,图像处理例程可能需要其他类型 临时图像等。
不必是模板化对象具有给予我们的优势 控制如何编译对象,并让我们控制代码 膨胀。
我对上述文字的疑问
作者的意思是“即使您的用户只需要有限的类型,图像处理程序也可能需要其他类型的临时图像等。”
作者的意思是“不必模板化对象的优点是可以让我们控制对象的编译方式”?
请求您帮助理解上述陈述。如果用简单的例子解释会很好。
感谢您的时间和帮助。
答案 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
然而,实际问题是识别可以合并的功能,只要有大量的功能。
那么?如果希望限制生成的代码量,则只需限制实例化的数量。我发现作者声称图像处理程序可能需要其他类型的临时图像等可疑。程序中的一组类型通常是相当受限制的,并且没有图像类型的数据。