結構體大小的計算

2021-05-24 10:41:13 字數 1712 閱讀 7422

位元組對齊原則

結構體預設的位元組對齊一般滿足三個準則:

1) 結構體變數的首位址能夠被其最寬基本型別成員的大小所整除;

2) 結構體每個成員相對於結構體首位址的偏移量(offset)都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組(internal adding);

3) 結構體的總大小為結構體最寬基本型別成員大小的整數倍,如有需要編譯器會在最末乙個成員之後加上填充位元組(trailing padding)。

通過這三個原則,就不難理解下面兩個struct的差異了.

結構體(struct)的sizeof值,並不是簡單的將其中各元素所佔位元組相加,而是要考慮到儲存空間的位元組對齊問題。先看下面定義的兩個結構體.

struct s1;

struct s2;

分別用程式測試得出sizeof(s1)=6 , sizeof(s2)=4

可見,雖然兩個結構體所含的元素相同,但因為其中存放的元素型別順序不一樣,所佔位元組也出現差異。這就是位元組對齊原因。通過位元組對齊,有助於加快計算機的取數速度,否則就得多花指令週期。

對於struct s1, 為了使short變數滿足位元組對其準則(2), 即其儲存位置相對於結構體首位址的offset是自身大小(short佔2個位元組)的整數倍,必須在位元組a後面填充乙個位元組以對齊;再由準則(3),為了滿足結構體總大小為short大小的整數倍,必須再在c後面填充乙個位元組。

對於struct s2, 卻不必如上所述的填充位元組,因為其直接順序儲存已經滿足了對齊準則。

如果將上面兩個結構體中的short都改為int(佔4個位元組), 那麼會怎麼樣呢? 程式得出sizeof(s1)=12, sizeof(s2)=8 利用上面的準則,也不難計算得出這樣的結果。s1中在a後面填充3個位元組、在c後面填充3個位元組,這樣一共12個位元組;s2中在a、b順序儲存之後填充兩個位元組用以對其,這樣一共就8個位元組。

當然,在某些時候也可以設定位元組對齊方式。這就需要使用 #pragma pack 。

#pragma pack(push) //壓棧儲存

#pragma pack(1)// 設定1位元組對齊

struct s1;

#pragma pack(pop) // 恢復先前設定

如上所示,將對其方式設為1位元組對齊,那麼s1就不填充位元組,sizeof為各元素所佔位元組之和即4。這一點在從外部2進製檔案中讀入struct大小的資料到struct中,是很有用的.

此外,對於空結構體(即內部沒有任何元素),在unix平台gcc4.1下的sizeof 為0,而在windows平台vc6下得出的sizeof卻為1!

#pragma pack(push,1)

typedef struct dummy_data_t

dummy_data;

#pragma pack(pop)

此時sizeof(dummy_data_t)的大小為20(4+8+8),而不是24(8+8+8)!

再補充一點:

可以使用 #pragma pack(1) 預編譯命令來指定對齊方式;#pragma pack(1)表示按位元組對齊。這個對齊時所可以指定的值為:1、2、4、8、16,除了這些以外目前好像都是非法的。

另外,想要程式獲得最佳的執行效率,那個所用到的各個變數的長度都應該是系統位數的整數倍。比如:程式要執行在32位的作業系統上,那麼4個位元組長的int型將會是效率最高的變數。其它的如結構體等等,都最好能保證其大小為4位元組的整數倍.

微控制器中結構體的大小不遵循位元組對齊原則,按實際位元組大小計算。

計算結構體大小

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

計算結構體大小

include include include define uint32 unsigned int define uint16 unsigned short define uint8 unsigned char define bool unsigned char 位元組型別列舉 enum type...

計算結構體的大小

結構體中的成員可以是不同的資料型別,成員按照定義時的順序依次儲存在連續的記憶體空間。和陣列不一樣的是,結構體的大小不是所有成員大小簡單的相加,需要考慮到系統在儲存結構體變數時的位址對齊問題。看下面這樣的乙個結構體 struct stu1 先介紹乙個相關的概念 偏移量。偏移量指的是結構體變數中成員的位...