当前位置: 首页 > news >正文

c++--模板--实例化

模板实例化的位置

注意,在最终的代码中,只有编译单元(一个.cpp文件就是一个编译单元),没有头文件之说,所以,即使你的模板放在头文件中,最终头文件也只是插入到元文件中作为一个编译单元。

所以模板的实例化是直接在每一个编译单元中实力化。

那么多而编译单元,如果实例化出相同的函数或者对象,怎么办?

链接时,链接器会保留其中一份(通常通过 COMDAT 节去重),但编译阶段仍需多次实例化,拖慢编译速度(这句话来源于deepseek)。

代码编译慢

如果你的项目编译起来比较慢,甚至卡顿,那么原因大概率是因为使用了模板对象和模板函数,而且跟多地方实例化了模板对象或者模板函数。

编译期生成代码

  • 模板不是运行时机制:每次使用不同的模板参数(如 std::vector<int>std::vector<float>),编译器会在编译时生成一份独立的代码(实例化)。

  • 重复实例化:同一个模板在多个编译单元(.cpp 文件)中被不同参数实例化时,每个文件都会生成一次代码,导致冗余工作。

重复实例化:同一个模板在多个编译单元(.cpp 文件)中被不同参数实例化时,每个文件都会生成一次代码,导致冗余工作。
如果多一个编译单元中使用相同的参数实例化,是只会生成一个实例化对象,还是实例化出多个对象?

在 C++ 中,如果同一个模板在多个编译单元(.cpp 文件)中以相同的参数实例化,默认情况下每个编译单元都会独立生成一份实例化代码,导致冗余。

如何避免重复实例化

显式实例化(Explicit Instantiation)

一个单独的编译单元中显式实例化模板,其他文件通过 extern 声明引用它:

// vector_int.cpp(显式实例化)
#include <vector>
template class std::vector<int>;  // 显式实例化

// a.cpp(其他文件声明外部实例)
#include <vector>
extern template class std::vector<int>;  // 声明不实例化
void foo() { std::vector<int> v; }

// b.cpp
#include <vector>
extern template class std::vector<int>;  // 同上
void bar() { std::vector<int> v; }

  • 效果

    • std::vector<int> 仅在 vector_int.cpp 中实例化一次。

    • 链接时所有文件共享同一份代码。

  • 优点:显著减少编译时间和目标文件大小。

这种方式来源于deepseek,未验证。

http://www.dtcms.com/a/311870.html

相关文章:

  • ARM处理器概述及对比
  • 2025熵密杯 -- 初始谜题 -- Reproducibility
  • 基于落霞归雁思维框架的应用与实践研究
  • 计数组合学7.11(RSK算法)
  • Android动画实现控件形状、大小逐渐过渡
  • 智能制造——解读CMMM评估手册【附全文阅读】
  • DyWA:用于可推广的非抓握操作的动态自适应世界动作模型
  • 硅基计划3.0 学习总结 伍 优先级队列排序初识
  • 【Vue3】Class绑定:从基础到高级的完整指南
  • Web前端实现银河粒子流动特效的3种技术方案对比与实践
  • 【完结篇】华为OpenStack架构学习9篇 连载—— 09 OpenStack编排管理【附全文阅读】
  • 深入 Go 底层原理(三):Goroutine 的调度策略
  • OSPF综合
  • VS Code高效开发指南:快捷键与配置优化详解
  • 深入 Go 底层原理(十二):map 的实现与哈希冲突
  • Mybatis学习之获取参数值(四)
  • 字符串(java不死)
  • c++之基础B(进制转换)(第三课)
  • 详解Python标准库之并发执行
  • AI Agent开发学习系列 - LangGraph(3): 有多个输入的Graph
  • C#多数据库批量执行脚本工具
  • OneCode3.0 核心表达式技术深度剖析:从架构设计到动态扩展
  • 波士顿咨询校招面试轮次及应对策略解析
  • 双机并联无功环流抑制虚拟阻抗VSG控制【simulink仿真模型实现】
  • OneCodeServer 架构深度解析:从组件设计到运行时机制
  • 「iOS」————weak底层原理
  • Conda创建虚拟环境,解决不同项目的冲突!
  • Windows本地使用dify搭建知识库+ollama+deepseek
  • 从零打造大语言模型--处理文本数据
  • vue引入阿里巴巴矢量图库的方式