例一:

#include <iostream> using namespace std; class A { public: char c; }; class B { public: int a; short b; }; class C { public: int a; short b; char c; }; class D { public: int a; short b; char c; char d; }; class E { public: int a; short b; char c; char d; char e; }; int main() { cout<< "sizeof(A) = " <<sizeof(A) << endl; cout<< "sizeof(B) = " <<sizeof(B) << endl; cout<< "sizeof(C) = " <<sizeof(C) << endl; cout<< "sizeof(D) = " <<sizeof(D) << endl; cout<< "sizeof(E) = " <<sizeof(E) << endl; return 0; }
輸出:
這里是32位機器,sizeof(B)=8,sizeof(C)=8,sizeof(E)=12的原因是字節對齊,編譯器會在最末一個成員之后填充字節。
例二:

#include <iostream> using namespace std; class Base { public: Base(int x) : a(x) {} void print() { cout << "Base" << endl; } private: int a; }; class Derived : public Base { public: Derived(int x) : Base(x - 1), b(x) {} void print() { cout << "Derived" << endl; } private: int b; }; class A { public: A(int x) : a(x) {} virtual void print() { cout << "A" << endl; } private: int a; }; class B : public A { public: B(int x) : A(x - 1), b(x) {} virtual void print() { cout << "B" << endl; } private: int b; }; int main() { cout<< "sizeof(Base) = " <<sizeof(Base) << endl; cout<< "sizeof(Derived) = " <<sizeof(Derived) << endl; cout<< "sizeof(A) = " <<sizeof(A) << endl; cout<< "sizeof(B) = " <<sizeof(B) << endl; return 0; }
輸出:
sizeof(Base)=4,int占4字節,print()函數不占內存;
sizeof(Derived)=8,比Base多一個int成員;
sizeof(A)=8,int占4字節,但是含有虛函數,包含了一個隱含的虛表指針成員,占4字節,共計8字節;
sizeof(B)=12,比A多一個int成員,共計12字節;
這里可能會存在一個疑問:B中也存在一個指向虛函數表的指針,所以應該是16字節。
解釋:虛表指針(vptr)是作為對象的一部分存在於對象的空間中,一個類只有一個虛表指針,所以A中的虛表指針和B中的虛表指針是同一個,所以是12字節。
例三:

#include <iostream> using namespace std; class A { }; class B { }; class C : public A, public B { }; class D : virtual public A { }; class E : virtual public A, virtual public B { }; class F : public D { }; class G { public: int a; static int b; }; int main() { cout<< "sizeof(A) = " <<sizeof(A) << endl; cout<< "sizeof(B) = " <<sizeof(B) << endl; cout<< "sizeof(C) = " <<sizeof(C) << endl; cout<< "sizeof(D) = " <<sizeof(D) << endl; cout<< "sizeof(E) = " <<sizeof(E) << endl; cout<< "sizeof(F) = " <<sizeof(F) << endl; cout<< "sizeof(G) = " <<sizeof(G) << endl; return 0; }
輸出:
sizeof(A) = 1,類A是空類,編譯器會安插一個char空類,標記它的每一個對象,因此為1字節;
sizeof(B) = 1,同上;
sizeof(C) = 1,類C多重繼承類A和類B,大小仍然為1字節;
sizeof(D) = 4,類D虛繼承自A,編譯器安插了一個指向父類的指針,大小為4字節;
sizeof(E) = 4,類E虛繼承自A和B,因此它有指向父類A和父類B的指針,加起來為8字節。注意:在GNU編譯器下編譯字節是4字節;
sizeof(F) = 4,類F繼承D,大小為4字節;
sizeof(G) = 4,類G有一個static成員,這個靜態成員不在類的實例中,而是像全局變量一樣在靜態存儲區中,被類G共享,所以只計算一個int成員,為4字節;
PS:如果在A中加入char a;
輸出:sizeof(D) = 8 sizeof(E) = 8 sizeof(F) = 8 ,理由是字節對齊。
例四:

#include <iostream> using namespace std; union u1 { double a; int b; }; union u2 { char a[13]; int b; }; union u3 { char a[13]; char b; }; int main() { cout<< "sizeof(u1) = " <<sizeof(u1) << endl; cout<< "sizeof(u2) = " <<sizeof(u2) << endl; cout<< "sizeof(u3) = " <<sizeof(u3) << endl; return 0; }
輸出:
這里定義了三個聯合體。聯合體的大小取決於它所有成員中占用空間最大的一個成員的大小。對於符合數據類型,例如union,struct,class,對齊方式為成員中最大成員的對齊方式。
sizeof(u1) = 8,最大成員為double a,為8;
sizeof(u2) = 16,最大成員是char[13]的數組,但由於另一個成員int b,使u2的對齊方式變成4,所以u2的大小為4的倍數,所以占用的空間由13對齊成16;
sizeof(u3) = 13,最大成員是char[13]的數組,另一個成員char b,所以大小為13;
例五:(查看32位和64位機器字節大小)
#include <iostream> using namespace std; int main() { cout<< "sizeof(char) = " <<sizeof(char) << endl; cout<< "sizeof(short) = " <<sizeof(short) << endl; cout<< "sizeof(int) = " << sizeof(int) <<endl; cout<< "sizeof(double) = " <<sizeof(double) << endl; cout<< "sizeof(long) = " <<sizeof(long) << endl; cout<< "sizeof(longlong) = " <<sizeof(long long) << endl; cout<< "sizeof(void*) = " << sizeof(void*) <<endl; cout<< "sizeof(char*) = " << sizeof(char*) <<endl; cout<< "當前系統是sizeof(void*) * 8 = " << sizeof(void*)*8<<"位"<<endl; return 0; }
32位輸出:
64位輸出:
sizeof(char) = 1
sizeof(short) = 2
sizeof(int) = 4
sizeof(double) = 8
sizeof(long) = 8
sizeof(longlong) = 8
sizeof(void*) = 8
sizeof(char*) = 8
當前系統是sizeof(void*) * 8 = 64位
說明:
1.long型變量在32位是4字節,64位是8字節
2.指針變量在32位是4字節,64位是8字節