sizeof 位元組對齊

2021-06-18 09:48:59 字數 1153 閱讀 6355

怎麼判斷記憶體對齊規則,sizeof的結果怎麼來的,要牢記以下3條原則:(在沒有#pragma pack巨集的情況下,看最後一行)

1:資料成員對齊規則:結構(struct)(或聯合(union))的資料成員,第乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小或者成員的子成員大小(只要該成員有子成員,比如說是陣列,結構體等)的整數倍開始(比如int在32位機為4位元組,則要從4的整數倍位址開始儲存。

2:結構體作為成員:如果乙個結構裡有某些結構體成員,則結構體成員要從其內部最大元素大小的整數倍位址開始儲存.(struct a裡存有struct b,b裡有char,int ,double等元素,那b應該從8的整數倍開始儲存.)

3:收尾工作:結構體的總大小,也就是sizeof的結果,必須是其內部最大成員的整數倍.不足的要補齊.

示例:

1. sizeof 值為( 4 ) + 4 + 4 = 12

typedef struct testtest;

a位於0開始,b要以1的倍數開始, c 要以4的倍數開始, d 要以1的倍數開始。整個結構體test要以 max( 1, 4 ) 倍數開始。

2. sizeof 值為( 8 ) +

8+ 4 + 4 + 4 = 28,

不是8的倍數,故增加到32

.

typedef struct testtest;

a位於0開始,e要以8開始,b要以1的倍數開始, c 要以4的倍數開始, d 要以1的倍數開始。整個結構體test要以 max( 1, 4,  8 ) 倍數開始。

在1、2中,

windows下vs預設 #pragma pack(8), 而linux下 gcc 預設 #pragma pack(4)並且只能是1、2、4。

位元組對齊與sizeof

本文主要包括二個部分,第一部分重點介紹在vc中,怎麼樣採用sizeof來求結構的大小,以及容易出現的問題,並給出解決問題的方法,第二部分總結出vc中sizeof的主要用法。1 sizeof應用在結構上的情況 請看下面的結構 struct mystruct 對結構mystruct採用sizeof會出現...

sizeof 與 位元組對齊

sizeof是運算子,可用於任何變數名 型別名或常量值,當用於變數名 不是陣列名 或常量時,它不需要用圓括號。它在編譯時起作用,而不是執行時。這是初學者問得最多的乙個問題,所以這裡有必要多費點筆墨。讓我們先看乙個結構體 struct s1 問sizeof s1 等於多少聰明的你開始思考了,char佔...

位元組對齊 結構體變數的sizeof

首先回顧一下,32位與64位 指的是暫存器的位寬 作業系統下,不同資料型別所佔的位元組數 32位作業系統環境下 字元型 char 1 unsigned char 1 整型 int 4 unsigned int 4 short 2 unsigned short 2 long 4 unsigned lo...