C/C++ 計算結構體大小

計算結構體的大小:
結構體中可以定義的數據類型:
1.基本類型
2.上面已經出現過的數據類型,比如說上面已經定義過的結構體
3.指向自己的指針
因爲內存對齊的問題,各個數據類型放的位置不同就會導致結構體的大小不一樣,那麼到底
怎樣計算一個結構體的大小呢?
先介紹一個概念——偏移量,結構體中的偏移量就是結構體成員和結構體變量的地址之差,
比如說第一個結構體成員的偏移量就是0,第二個結構成員的偏移量就是第一個結構體成員
的大小,假如第一個成員的是int b;那麼第二個結構體成員變量的偏移量就是4,
計算結構體大小的規則:
1.每一個成員的偏移量都必須是該成員的倍數。
2.結構體的大小必須是該結構體字節數最大成員的倍數。
例如下面的結構體:例一:
struct A
{
char a;
short b;
int c;
};
第一個成員的偏移量都是0;一般可以不看,a的大小爲1,所以成員b的偏移量爲1,b的大小爲2,1不是2的倍數,所以應該將1+1,成爲2的倍數,成員c的偏移量就爲1+1+2,是成員c的倍數,現在就符合計算結構體大小的第一條:改成員的偏移量是該成員大小的倍數,還有第二條規則:結構體大小是結構體最大成員的倍數,結構體的大小就是各個成員之和,a;2,b:2,c:4加起來就是8,該結構最大成員爲c大小爲4,滿足第二個條件,所以該結
構體的倍數就是8

例二:
struct Data
{
char a;
int b;
int64_t c; 該數據類型是有符號的佔64位的整型數據類型
char d;
}

成員a的偏移量就不用看了,上面有說每一個結構體第一個成員的偏移量都爲0;
但他的大小是1,也就是成員b的偏移量,成員b的大小是4,1不是4的倍數,所以a
的大小1應該加上3,就是4,成員3的偏移量是8,成員c的大小是8,成員c的偏移量是
成員c大小的倍數,就不用增加大小,成員d的偏移量是16,成員d的大小是1,偏移量
是成員大小的倍數,現在就符合計算結構體大小的第一條:改成員的偏移量是該成員大小
的倍數,還有第二條規則:結構體大小是結構體最大成員的倍數,最大成員爲c,大小
是8,結構體的大小就是各個成員之和,a:4,b:4,c:8,d:1所有的加起來就是17,
但是17不是8的倍數,所以應該將17+7就是24,所以該結構體的大小就是24

本文轉自https://www.cnblogs.com/smile-812/p/7897187.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章