当前位置: 首页 > 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 不兼容问题。

  

        

相关文章:

  • 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