記憶體位址的對齊

2021-04-26 19:34:00 字數 2527 閱讀 3461

3:有#pragma pack(int)進行設定,如果結構體某成員的sizeof大於你設定的,則按你的設定來對齊

注意:每次用#pragma pack(int)進行設定後,要用#pragma pack()對其結束,免得造成錯誤

view plain

copy to clipboard

print

?

#include

using

namespace std;   

struct a   

;   

struct b   

;   

#pragma pack(2)

struct c   

;   

#pragma pack()

#pragma pack(1)

struct d   

;   

#pragma pack()

intmain()     

view plain

copy to clipboard

print

?

sizeof(a) = 8   

sizeof(b) = 12   

sizeof(c) = 8   

sizeof(d) = 7   

press any key to continue

注意下面我對#pragma pack() 用法的理解,他不僅對每個成員的起始位址起作用,對整個的也起作用。請看下面的測試程式

view plain

copy to clipboard

print

?

#include

using

namespace std;   

#pragma pack(4)

struct aa   

;//16 

#pragma pack()

#pragma pack(2)

struct aaa   

;//14 只要保證是2的倍數,不是最大double的8的倍數

#pragma pack()

intmain()     

view plain

copy to clipboard

print

?

sizeof(a) = 24   

sizeof(aa) = 40   

sizeof(a2) = 20   

sizeof(aa2) = 28   

press any key to continue

下面接受有結構體巢狀的時候:

對於整個結構體作為成員函式時,他的起始位址不是以該結構體整體作為標準,而是以其內的成員為標準

view plain

copy to clipboard

print

?

#include

using

namespace std;   

struct a   

;//24

struct aa   

;   

#pragma pack(4)

struct a2   

;//20

#pragma pack()

struct aa2   

;   

intmain()     

view plain

copy to clipboard

print

?

sizeof(a) = 24   

sizeof(aa) = 16   

sizeof(aaa) = 14   

press any key to continue

最後注意:static成員和函式其實是類層次的,不在物件中分配空間,而成員函式其實是被編譯為全域性函式了,所以也不在物件中。

view plain

copy to clipboard

print

?

#include

using

namespace std;   

struct empty{}; // 1

struct constandstatic   

void testnostatic(){}   

}; // 16

intmain()     

view plain

copy to clipboard

print

?

sizeof(empty) = 1   

sizeof(constandstatic) = 16   

press any key to continue

記憶體位址對齊

記憶體位址對齊,是一種在計算機記憶體中排列資料 訪問資料的一種方式,包含了兩種相互獨立又相互關聯的部分 基本資料對齊和結構體資料對齊。當今的計算機在計算機記憶體中讀寫資料時都是按字 word 大小塊來進行操作的 在32位系統中,資料匯流排寬度為32,每次能讀取4位元組,位址匯流排寬度為32,因此最大...

自然對齊(記憶體位址)

c 中 基本資料型別的變數不能簡單的儲存於記憶體中的任意位址,他們的起始位址必須能被他們的大小整除。typedef unsigned char byte enum color struct eigth double m price color m color bool m isshift bool ...

記憶體位址對齊方式

對齊的作用和原因 各個硬體平台對儲存空間的處理上有很大的不同。一些平台對某些特定型別的資料只能從某些特定位址開始訪問。其他平台可能沒有這種情況,但是最常見的是如果不按照適合其平台的要求對資料存放進行對齊,會在訪問效率上帶來損失。比如有些平台每次讀都是從偶位址開始,如果乙個int型 假設為 32位 如...