3:有#pragma pack(int)進行設定,如果結構體某成員的sizeof大於你設定的,則按你的設定來對齊
注意:每次用#pragma pack(int)進行設定後,要用#pragma pack()對其結束,免得造成錯誤
view plain
copy to clipboard
?
#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
?
sizeof(a) = 8
sizeof(b) = 12
sizeof(c) = 8
sizeof(d) = 7
press any key to continue
注意下面我對#pragma pack() 用法的理解,他不僅對每個成員的起始位址起作用,對整個的也起作用。請看下面的測試程式
view plain
copy to clipboard
?
#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
?
sizeof(a) = 24
sizeof(aa) = 40
sizeof(a2) = 20
sizeof(aa2) = 28
press any key to continue
下面接受有結構體巢狀的時候:
對於整個結構體作為成員函式時,他的起始位址不是以該結構體整體作為標準,而是以其內的成員為標準
view plain
copy to clipboard
?
#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
?
sizeof(a) = 24
sizeof(aa) = 16
sizeof(aaa) = 14
press any key to continue
最後注意:static成員和函式其實是類層次的,不在物件中分配空間,而成員函式其實是被編譯為全域性函式了,所以也不在物件中。
view plain
copy to clipboard
?
#include
using
namespace std;
struct empty{}; // 1
struct constandstatic
void testnostatic(){}
}; // 16
intmain()
view plain
copy to clipboard
?
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位 如...