如何做网站迁移,微平台,武进网站建设咨询,源码屋官网C对象的大小不同的编译器的实现是不一样的#xff0c;以下仅讨论.net2003#xff0c;其他编译的可能出现的结果以下也做了分析和猜测。在反推不同编译器实现的C对象的大小时。对齐是一个很重要也容易被遗忘的问题。class A{}; 类A是一个空类#xff0c;但是它的大小并不… C对象的大小不同的编译器的实现是不一样的以下仅讨论.net2003其他编译的可能出现的结果以下也做了分析和猜测。在反推不同编译器实现的C对象的大小时。对齐是一个很重要也容易被遗忘的问题。 class A{}; 类A是一个空类但是它的大小并不为0编译期间编译器会插入一个char在其中这个char我们是看不到的这样的用处是保证生成的不同对象具有不同地址就是要对象里有东西。class B:public virtual A{};B类是对A类的虚继承B中一般会有指向A的实例的指针在IA-32下为4bytes。这里不同编译器的实现差别很大有的编译器在B的对象中也 会保留A类的那个隐含的char于是就有145个bytes再考虑对齐有些编译器产生的结果为8bytes但是在.net2003中优化过了不会有A中的char也就不需要对齐只有4bytes大class C:public virtual A{};//同上class D:public B,public C{}; //D为8如果编译器不优化A中的char就会有1(A)8(B)8(C)-4(B对A虚继承)-4(C对A虚继承)3(对齐)12bytesclass E{ int i; };//很明显4bytesclass F{ double d;};//很明显8bytesclass G{ double num; char in; };//8bytes对齐所以是8(double)4(int)4(对齐)16class H{ int num; double in; };//同上class I{ int num; double in; public: virtual ~I(){};};//8(double)4(int)4(对齐)4(vptr)4(对齐)24class J{ double num; int in; public: virtual ~J(){};};//同上8(double)4(int)4(对齐)4(vptr)4(对齐)24class K{ int i; int k;public: virtual ~K(){};};//4(int)4(int)4(vptr)12class L{ int i; int j; L(){};public: float ll(int i) { return 0.0;}static int hhh(int i) { return 0.0;} virtual ~L(){};virtual ji(){};};//虚函数表的指针vptr只有类中出现虚函数才会出现它指向虚函数表所有虚函数的地址存放在此表中。//4(int)4(int)4(vptr)12从中看出不管有多少虚函数大小不变因为类中之保存虚函数表。//不管成员函数有多少类大小也不变因为他们不保存在对象中无论是否是静态int main(){cout A sizeof(A)endl;cout B sizeof(B)endl;cout C sizeof(C)endl;cout D sizeof(D)endl;cout E sizeof(E)endl;cout F sizeof(F)endl;cout G sizeof(G)endl;cout H sizeof(H)endl;cout I sizeof(I)endl;cout J sizeof(J)endl;cout K sizeof(K)endl;cout L sizeof(L)endl;}/*******************************************************************/ output .net2003A 1B 4C 4D 8E 4F 8G 16H 16I 24J 24K 12L 12 转载于:https://www.cnblogs.com/weilf/p/4156523.html