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

C++ 编程指南35 - 为保持ABI稳定,应避免模板接口

一:概述

        模板在 C++ 中是编译期展开的,不同模板参数会生成不同的代码,这使得模板类/函数天然不具备 ABI 稳定性。为了保持ABI稳定,接口不要直接用模板,先用普通类打个底,模板只是“外壳”,这样 ABI 才稳定。这样做有两个好处:

  1. 所有模板实例共享一个实现代码(避免为每个 List<T> 生成一份几乎相同的 add_frontunlink 等函数)。

  2. 核心逻辑只定义一次,因此更容易保持 ABI 稳定性,并且编译速度更快。

二:示例

       Link_base 是一个通用的双向链表节点结构,不带类型信息,List_base 是核心链表实现,只操作 Link_base*,实现的是无类型的插入逻辑。

struct Link_base {
    Link_base* suc;
    Link_base* pre;
};

struct List_base {
    Link_base* first;
    int sz;
    void add_front(Link_base* p);
};

         List<T> 是一个轻量级的包装类,它提供类型安全,但实际的插入操作是调用的 List_base::add_front。这样,List<int>List<string> 这些实例共享一份核心代码,只在包装层做转换和封装。

template<typename T>
struct Link : Link_base {
    T val;
};

template<typename T>
class List : List_base {
public:
    void put_front(const T& e) { add_front(new Link<T>{e}); }
    T& front() { static_cast<Link<T>*>(first)->val; }
};

三:总结       

        所以为了保持 ABI 稳定,本规则建议将模板代码与核心逻辑分离,使用非模板的基础类或接口作为稳定的 ABI 边界,模板只负责类型安全和包装。这种做法可以避免因模板实例化导致的代码膨胀和 ABI 不兼容问题。

  

        

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

相关文章:

  • SQL查询语句的执行顺序
  • C++(初阶)(十一)——list
  • 数据结构实验6.1:矩阵的螺旋方阵输出
  • 在ArcGIS Pro中将栅格NoData值修改为特定值
  • QEMU源码全解析 —— 块设备虚拟化(19)
  • 【项目管理】第12章 项目质量管理-- 知识点整理
  • JavaScript 输入输出语句
  • Docker 部署 Kafka 完整指南
  • 系统编程3(共享内存/信号量)
  • 【数据结构与算法】——堆(补充)
  • 人的需求更多是动物本能—观《枪王》
  • 计算视觉与数学结构及AI拓展
  • 【家政平台开发(41)】家政平台性能蜕变:性能测试与优化全解析
  • Spring Boot 中应用的设计模式
  • Spring Security + JWT 实现前后端分离权限控制实战教程
  • 机器人仿真:URDF与Gazebo
  • 学习MySQL的第九天
  • 【C++】 —— 笔试刷题day_15
  • Spring - 14 ( 5000 字 Spring 入门级教程 )
  • Linux网络http与https
  • LeetCode面试热题150中6-11题学习笔记(用Java语言描述)
  • 通过 spring ai 对接 deepseek ai 大模型通过向量数据库,完成 AI 写标书及构建知识库功能的设计与开发
  • 简约美观的地址发布页PHP源码带后台
  • 【3】k8s集群管理系列--包应用管理器helm之chart资源打包并推送到harbor镜像仓库
  • 粉末冶金齿轮学习笔记分享
  • Honor of Kings (S39) 13-win streak
  • Python中NumPy的随机操作
  • 5.1 GitHub订阅监控系统实战:FastAPI+SQLAlchemy高效架构设计与核心源码揭秘
  • 从一到无穷大 #45:InfluxDB MCP Server 构建:从工程实践到价值重构
  • 探秘 Python 网络编程:构建简单聊天服务器