結構體大小方式計算

2021-10-24 03:14:23 字數 1345 閱讀 7413

我們實際生活中,儲存的資料一般不會是同一種型別,所以引入了結構體。而結構體的大小也不是成員型別大小的簡單相加。需要考慮到系統在儲存結構體變數時的位址對齊問題。對齊方式很浪費空間,可按照計算機的訪問規則,這種對齊方式提公升了效率。

結構體成員的偏移量必須是成員大小的整數倍(0被認為是任何數的整數倍)

結構體大小必須是所有成員大小(陣列,結構體除外)的整數倍

首先要知道的是關鍵字佔多少個位元組:

struct s1

;

這個結構體的大小容易計算,滿足兩個原則即可,為8,那麼下面這個呢

struct s2

;

這個結構體大小是12,為什麼呢?仔細看看兩個原則,要滿足偏移量是成員的整數倍,ch1偏移量是0,i的偏移量不可能是1,因為1不是i大小4的倍數,所以i的偏移量是4,ch2的偏移量就變為了8,所以滿足結構體大小是成員大小整數倍,就是12。

struct s3

;

這個結構體的大小是20,先看前兩個成員,大小是8,毋庸置疑,這個char型別的陣列,只需要把它看做十個char連在一起即可,加起來就是18,再滿足結構體大小為成員整數倍,所以大小就是20。

struct s4

;float f;

};

這裡需要注意一下,裡面的結構體struct s的大小為8。但整體的大小卻為12。所以裡面的結構體大小並沒有算進去。因為裡面的結構體沒有進行宣告

我們來加個宣告:

struct s4demo;

float f;

};

加了宣告「demo」之後,整個結構體大小為20

struct s5;}

;

聯合體大小就是成員中最大型別的大小,所以這個結構體大小是12.

(1)對齊值小於最大型別成員值

#pragma pack(4)  

//指定向4對齊 最大是8

struct s6

;

如果我們沒有指定對齊值,這個結構體大小是24,我們指定向4對齊,所以大小是4的倍數,所以結構體大小是20

(2)對齊值大於最大型別成員值

#pragma pack(10)

struct s7

;

我們指定的對齊值是10,最大為8,是否就向10對齊?不是,當指定對齊值大於自身對齊值時,向自身對其值對齊,大小是24.

記憶體對齊(計算結構體大小)方法

struct stu1 結構體大小等於最後乙個成員的偏移量加上最後乙個成員的大小。第乙個成員i的偏移量為0。第二個成員c的偏移量是第乙個成員的偏移量加上第乙個成員的大小 0 4 其值為4 第三個成員j的偏移量是第二個成員的偏移量加上第二個成員的大小 4 1 其值為5。由於儲存變數時位址對齊的要求,編...

c語言計算結構體大小方法

一 記住以下四條規則 第乙個成員在與結構體變數偏移量為0的位址處。其他成員變數要對齊到某個數字 對齊數 的整數倍的位址處。對齊數 編譯器預設的乙個對齊數與該成員大小的較小值,在vs環境下預設值為8,在linux環境下預設值為4。結構體的總大小為最大對齊數 每個成員變數都有乙個對齊數 的整數倍。如果巢...

計算結構體大小

運算子sizeof可以計算出給定型別的大小,對於32位系統來說,sizeof char 1 sizeof int 4。基本資料型別的大小很好計算,我們來看一下如何計算構造資料型別的大小。c語言中的構造資料型別有三種 陣列 結構體和共用體。陣列是相同型別的元素的集合,只要會計算單個元素的大小,整個陣列...