sizeof使用

假设有如下代码:

#include<iostream> using namespace std; class A{ }; class B{ int i; }; class C{ void print(){} }; class D{ virtual void print(){} }; class E{ virtual void print(){} int i; }; class F{ virtual void print(){} int i; char* p; }; class G:public A{ }; class H:virtual public A{ }; class I:virtual public B{ }; class J:virtual public A,virtual public B{ }; class K{ static int b; }; class L{ int a; char b; char c; }; class M{ char b; char c; int a; }; class N{ char b; int a; char c; }; int main(){ cout<<sizeof(A)<<" "<<sizeof(B)<<" "<<sizeof(C)<<" "<<sizeof(D)<<" "<<sizeof(E)<<" "<<sizeof(F)<<" "<<sizeof(G)<<" "<<sizeof(H)<<" "<<sizeof(I)<<" "<<sizeof(J)<<" "<<sizeof(K)<<" "<<sizeof(L)<<" "<<sizeof(M)<<" "<<sizeof(N)<<endl; cout<<"******************************************"<<endl; system("PAUSE"); return 0; }

输出结果为:

1 4 1 4 8 12 1 4 8 8 1 8 8 12

解析:

A为空类,空类所占空间为1

B里面带有一个int元素,int占空间4

C里面没有数据成员,相当于空类,占空间1

D有虚函数,虚函数涉及到虚表(虚指针),因此占空间4(注意,此处假设还有其他虚函数,但是只要没有数据成员,所占空间还是4)

E里面除了虚函数还有一个int成员,因此占空间8

F中除了虚函数跟int成员外还有一个char*指针,但是不管是什么指针,其所占空间都为4,因此总共为12

G单一继承空类A,因此其所占空间还是1(注意,即使是多重继承空类,则其所占空间还是1)

H虚继承A,因为涉及到虚表,因此其所占空间为4

I虚继承B,因为涉及到虚表,并且B中本来有一个int变量,因此所占空间为8

J虚继承A,B,因为涉及到虚表,并且B中本来有一个int变量,因此所占空间为8(不因为两个虚继承而为12)

K中有一个静态变量,因为静态变量是存放在全局数据区的,而sizeof计算栈中分配的大小,是不会计算静态变量的,因此其所占空间为1

L,M,N涉及到内存中数据对齐的问题无论是先int后两个char或者先两个char再来一个int,其所占空间为8,而一个char,一个int,一个char所占空间为12(此时为了对齐,每个char占空间4)

你可能感兴趣的:(sizeof使用)