C++二进制兼容性
2012-03-27 10:23
330 查看
学习、工作中总结的条款,不喜勿扰~
由于标准委员会一直没有统一标准的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++ 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++二进制兼容性
- 静态链接中的那点事儿(2):C++二进制兼容性及跨平台初步
- C++ 工程实践(4):二进制兼容性
- C/C++缺陷与陷阱(一)二进制兼容性(动态库)
- C/C++ 的二进制兼容性
- C++ 工程实践(4):二进制兼容性
- C++ 工程实践(4):二进制兼容性http://blog.csdn.net/Solstice/article/details/6233478
- C++ 工程实践(4):二进制兼容性
- C++ 十进制转换为二进制的实例代码
- 近日探得用C++将二进制数据存储到XML文件的方法,因在研究时,未得到网上其他同仁的帮助(网上搜索了半天没有相关资料,只有DOTNET的),在这里不敢独享,给别的同仁在搜索时能够搜索到相关资料,也算是绵薄之力! )
- 用C++中STL提供的fstream和stream_iterator读写二进制文件。
- C++ 64位的平台兼容性
- 基于链表的学生成绩管理系统——C++二进制文件读写string对象时出现的错误
- 基于C++实现文件的明文和二进制读写
- int abs(int number)函数有感: 求补码和通过补码求对应的整数 C++(增加:数字的二进制表示中1的个数)
- C/C++ 图像二进制存储与读取
- 如何解决程序/C++Dll的兼容性问题
- C++ 11新特性笔记-1: 保证稳定性和兼容性
- C#和C++的二进制通讯(转帖)
- c++ mysql二进制存取,blob存取