模板中的编译控制和代码膨胀
compilation control and code bloat in templates
我正在阅读应用C++书中的模板,下面提到了
模板创建代码膨胀。编译器将实例化一个模板对象。即使您的用户只需要有限的类型,图像处理例程可能需要用于临时图像等。
不必模板化对象的优点是控制如何编译对象,并让我们控制代码膨胀。
我对以上文本的问题
-
作者所说的"即使您的用户只需要有限的类型,图像处理例程也可能需要临时图像等的额外类型"是什么意思?
-
作者所说的"不必模板化对象的优点是让我们可以控制如何编译对象"是什么意思?
请您帮助理解上述陈述。如果用简单的例子来解释就好了。
谢谢你的时间和帮助。
作者是对的,模板可能会创建所谓的代码膨胀,但他的解释是模糊的。。。
让我们从代码膨胀的入门知识开始。
在C++标准中,模板和函数指针之间有一个令人讨厌的交互:
- 具有给定参数集的模板的每个实例化都是其自己的类型
- 两个不同的函数应该有不同的地址
由于两个不同的实例化(例如,一个具有int
,一个带有long
)是不同的类型,因此与它们相关联的函数是不同的函数,因此它们需要不同的地址。
如果程序员无法意识到函数已合并,则允许优化编译器根据"好像"规则实际合并函数。天真的尝试是试图证明其中一人的地址从未被占用,这是徒劳的。一个更聪明的策略是合并功能体,但仍然提供不同的地址:
; assembly-like code
function_instantiation_1:
nop ; offset to have different addresses
function_instantiation_2:
; body of both functions
然而,一个实际的问题是,考虑到函数的数量,确定可以合并的函数。
那么呢?如果希望限制生成的代码量,只需要限制实例化的数量。我发现作者声称图像处理例程可能需要额外类型的临时图像等等是可疑的。程序中的类型集通常受到相当大的限制,并且没有大量的图像类型。
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 添加虚拟析构函数会使代码大小膨胀
- 考虑到今天的处理器,代码膨胀是否不再重要?
- 模板代码因unordered_map而膨胀
- 不使用模板参数的函数使过多的代码膨胀?
- 了解模板代码膨胀
- 模板中的编译控制和代码膨胀
- 使用GCC/CLANG跟踪代码膨胀的工具
- 使用 std::array<T, N> 会导致代码膨胀吗?