C++二进制兼容性

原创 2012年03月27日 10:23:11
学习、工作中总结的条款,不喜勿扰~

  由于标准委员会一直没有统一标准的C++ ABI,导致各个厂商都有自己的一套体系,为了不出意外,循规蹈矩也有一定的必要,但可以斟酌,三思而后行。

  能:1. 可以添加非virtual函数2. 可以添加enum到class 3. 可以追加enum值到已存在enum中4. 可以去掉private限制符没有被inline函数调用或者被使用的且非virtual函数5. 可以添加static数据成员6. 添加新的class 7. 改变函数的默认参数8. 改变class的friend修饰符

  不能:1. 对于已存在的class不能export or unexport 2. 改变class的继承关系3. 改变模板参数4. 改变fucntion的unexport、remove、inline、重载5. 改变函数签名6. 在不含有任何virtual成员的类添加virtual function 7. 改变virtual函数的顺序8. 重载已存在的virtual function 9. 对于non-private的static成员或者non-static、non-member的public数据不能unexport、改变类型、改变CV-qualifiers

  为了将来class的扩展1. Pimpl 2. 添加non-inline virtual destructor 3. 是所有的contructors non-inline

  C++ABI 1. 对象的内存布局2. 虚函数的调用方式,通常是vptr/vtbl然后用vtbl[offset]调用3. name mangling(名字重整)

  4. RTTI和exception 5. 调用约定(参数传递的方式)

  源码兼容但二进制不兼容1. 给函数增加默认参数2. 增加虚函数,会造纸vtbl的排列变化(只在末尾增加有问题,该class可能已被继承)

  3. 增加默认模板参数类型,改变了name mangling 4. 改变已有enum的值5. 增大class数据成员,造成sizeof变大

  安全的做法1. 增加class 2. 增加non-virtual成员函数3. 修改数据成员名称,二进制代码是按偏移量访问4. ……

  解决方案1. 静态链接2. 动态库的版本管理来控制兼容性3. PIMPL,头文件之暴露non-virtua;接口,并且class的大小固定

  补充一点,COM的思想和做法有他的历史局限性,不过也相当完备,但是,我不推崇。

C++二进制兼容性

学习、工作中总结的条款,不喜勿扰~ 由于标准委员会一直没有统一标准的C++ ABI,导致各个厂商都有自己的一套体系,为了不出意外,循规蹈矩也有一定的必要,但可以斟酌,三思而后行。 能:...

静态链接中的那点事儿(2):C++二进制兼容性及跨平台初步

C++的一些语言特性使之必须由编译器和链接器共同支持才能完成工作。最主要的有两个方面,其一,C++的重复代码的消除;其二,全局构造与析构。此外,由于C++的各种特性,比如虚函数、函数重载、继承、异常等...

C++ 工程实践(4):二进制兼容性

陈硕 (giantchen_AT_gmail) Blog.csdn.net/Solstice 本文主要讨论 Linux x86/x86-64 平台,偶尔会举 Windows 作为反面教材。 C...
  • Solstice
  • Solstice
  • 2011年03月09日 10:46
  • 22036

java 二进制兼容性概述

现在的软件越来越依赖于不同厂商、作者开发的共享组件,组件管理也变得越来越重要。在这方面,一个极其重要的问题是类的不同版本的二进制兼容性,即一个类改变时,新版的类是否可以直接替换原来的类,却不至于损坏其...

Java二进制兼容性

一、概述 现在的软件越来越依赖于不同厂商、作者开发的共享组件,组件管理也变得越来越重要。在这方面,一个极其重要的问题是类的不同版本的二进制兼容性,即一个类改变时,新版的类是否可以直接替换原来的类...

Java二进制兼容性概述

本文是转载,用于本人查询使用,原地址为: http://www.ltesting.net/html/19/n-63819.html 现在的软件越来越依赖于不同厂商、作者开发的共享组件,...

Swift库二进制接口(ABI)兼容性研究

前言 阿里云APP组件化过程中,我们拆分出了若干基础组件库和业务代码库,由于代码是采用Swift编写的,所以这些库都是动态库形式。在上一个正式版本,组件化达到了完全形态,主工程只剩下一个壳,所有代码...

VC++中接口的二进制兼容性

在设计一个SDK或一个可重用的框架时,设计者必然要考虑的一个问题就是实现如何不同版本的兼容,即如何保证基于低版本开发的应用程序不需要作任何改动(如重新编译)就可以运行的在高版本的SDK或框架下。本文提...

二进制兼容性

陈硕 (giantchen_AT_gmail) Blog.csdn.net/Solstice本文主要讨论 Linux x86/x86-64 平台,偶尔会举 Windows 作为反面教材。C/C++ 的...
  • deyili
  • deyili
  • 2011年05月24日 16:08
  • 3780

C/C++兼容性程序设计必读

  • 2009年05月30日 08:08
  • 69KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++二进制兼容性
举报原因:
原因补充:

(最多只允许输入30个字)