struct和class內存大小的計算
阿新 • • 發佈:2018-10-27
有關 就是 大小 2個 ostream short out () 偏移
結構體內存大小的計算:
用例一:
#include<stdio.h> union ss { int a; char b; }; struct MyStruct { int temp1;//4個字節 char temp2;//一個字節,補齊3個字節 ss aa;//4個字節 char temp3;//一個字節 char temp4;//一個字節,補齊兩個字節 }; int main() { printf("%d", sizeof(MyStruct)); return 0; }
輸出 16
解析:對齊規則是按照成員的聲明順序,依次安排內存,對齊字節數為最大成員變量的字節大小,偏移量為最大成員變量的字節數的整數倍,在這個程序中對齊字節數為4,計算步驟如下:
首先是temp1 四個字節,temp2 一個字節,還剩3個字節,因為後面是aa 4個字節,可以自己對齊,所以temp2需要補齊3個字節, temp3 一個字節,temp4一個字節,對齊是4個字節,還剩2個字節需要補齊。所以總共是16個字節。
#include<stdio.h> union ss { int a; double b; }; struct MyStruct { int temp1;//4個字節 char temp2;//1個字節,對齊是8個字節,還需3個字節補齊 ss aa;//8個字節 char temp3;//1個字節 short temp4;//2個字節,補齊還需要5個字節 }; int main() { printf("%d", sizeof(MyStruct)); return 0; }
輸出結果為 24
#include<stdio.h> union ss { int a; double b; }; struct student { int name; char sex; double num; }; struct MyStruct { int temp1;//4個字節 char temp2;//1一個字節,補齊3個字節 ss aa;//8個字節 char temp3;//一個字節 short temp4;//2個字節,補齊5個字節 student people;//16個字節 }; int main() { printf("%d", sizeof(MyStruct)); return 0; }
結果為 40
解析:此時需要註意的是,對齊字節數8個字節,而不是16個字節。student people 對象內部先進行一次對齊,然後如果如果是外面對齊字節數的整數倍就不需要
再進行對齊了,如果不是就需要再次進行對齊。
下面的是需要二次對齊的程序:
#include<stdio.h> struct MyStruct { char temp1; char temp2; }; struct student { int name;//4個字節 char sex;//1個字節 MyStruct aa;//2個字節 char temp;//1個字節 }; int main() { printf("%d", sizeof(student)); }
輸出為 8
#include<stdio.h> union ss { int a; double b; }; struct student { //int name; //char sex; int num; }; struct MyStruct { int temp1;//4個字節 char temp2;//1一個字節,補齊3個字節 ss aa;//8個字節 char temp3;//1個字節 short temp4;//2個字節 student people;//4個字節,補齊一個字節 }; int main() { printf("%d", sizeof(MyStruct)); return 0; }
輸出結果為:24
總結,在一個結構體中有另一個結構體的對象時,對齊字節數與這個結構體對象的字節數無關,只與結構體中的成員變量和union 有關。
類的內存大小的計算:
#include<iostream> using namespace std; class student { public: student() { cout << "構造函數" << endl; } //void fun(); }; int main() { cout << sizeof(student) << endl; return 0; }
運行結果: 1
解析:如果是空類也會輸出1。如果一個類只含有成員函數沒有成員變量或者虛函數,類的大小都是1。如果含有靜態成員變量或者是靜態成員函數,也會是1,因為靜態成員變量和靜態成員函數是類的所有對象共享的,它並不存放在一個實例化對象中
為什麽空類也會是1呢?
所謂類的實例化就是在內存中分配一塊地址,每一個實例在內存中都有獨一無二的地址,而了到達這個效果,編譯器往往會給一個空類隱含的增加一個字節,這樣實例化出來的每一個空類的對象都會得到一個獨一無二的地址。如果空類的大小是0的話,那麽實例化出來的所有空類對象都是在同樣一個內存地址上,就相當於同一個對象,這不是我們想要的。
struct和class內存大小的計算