3、pragma pack(n)的作用
32位系統下:
sizeof
(short)=
2sizeof
(int)=
4sizeof
(long)=
4sizeof
(double)=
8sizeof
(float)=
4sizeof
(指標)=4
64位系統下:
sizeof
(short)=
2sizeof
(int)=
4sizeof
(long)=
4sizeof
(double)=
8sizeof
(float)=
4sizeof
(指標)
=8
規則如下:
1、每乙個變數的起始位址是自身大小的整數倍
2、最終結構體所佔位元組大小需要是結構體中最大變數的整數倍
#include
#include
using namespace std;
typedef
struct mystruct1
mys1;
typedef
struct mystruct2
mys2;
intmain()
聯合體中的各個成員都是從同一位址開始儲存的,每一時刻只能儲存乙個成員,這樣就需要在分配記憶體時滿足兩點:
(1)、共用體所佔記憶體時其最大成員的大小
(2)、若是聯合體內部最大成員所佔的空間對其他成員不滿足整數倍關係,則需要自動延伸,使得滿足整數倍關係
union mm
;
本來聯合體mm所佔記憶體大小應該是sizeof(int)*5 = 20位元組,但是20位元組和其中double的8位元組不滿足整數倍關係,所以mm所佔的大小應該是24位元組
規則如下:
1、聯合體或者結構體作為成員變數時,需要從其內部最大元素的整數倍開始儲存
2、最終結構體所佔位元組大小需要是結構體中**最大變數(內部結構體中的最大變數)**的整數倍
#include
//本來mm的空間應該是sizeof(int) * 5 = 20; 但是如果只是20個單元的話,
//那可以存幾個double型(8位)呢 ? 兩個半 ? 當然不可以, 所以mm的空間延伸為既要大於20,
//又要滿足其他成員所需空間的整數倍, 即24
typedef
union mm mm1;
typedef
struct mystruct1
mys1;
typedef
struct mystruct2
mys2;
typedef
struct mystruct3
mys3;
typedef
struct mystruct4
mys4;
typedef
struct mystruct5
mys5;
// 取80位元組(是mys3中最大位元組double所佔8位元組的整數倍)
typedef
struct mystruct6
mys6;
// 取88位元組(是mys3中最大位元組double所佔8位元組的整數倍)
typedef
struct mystruct7
mys7;
typedef
struct mystruct8
mys8;
// 取152位元組(是最大位元組mys3中double所佔8位元組的整數倍)
pragma pack(n)用於設定指定對齊值大小, 若是自身對齊值 大於 指定對齊值,則選用指定對齊值。
注:自身對齊值大小就是變數所佔記憶體大小
#include
// 若是自身對齊值 大於 指定對齊值,則選用指定對齊值
#pragma pack(2)
// 設定指定對齊值為2
struct data1
;// 18位元組
#pragma pack()
// 恢復預設對齊值
struct data2
;// 24位元組
#pragma pack(4)
// 設定指定對齊值為4
struct data3
;// 20位元組
#pragma pack()
// 恢復預設對齊值
intmain()
結構體位元組對齊
include pragma pack 2 struct t.pragma pack int main int argc,char argv 最後輸出的結果為 8。這個表示是按照2位元組來對齊資料,首先分配2位元組給成員變數i,分配完成後,還剩一位元組,zj add補0 沒法容納成員變數d,此時會再...
結構體位元組對齊
include pragma pack 2 struct t.pragma pack int main int argc,char argv 最後輸出的結果為 8。這個表示是按照2位元組來對齊資料,首先分配2位元組給成員變數i,分配完成後,還剩一位元組,zj add補0 沒法容納成員變數d,此時會再...
結構體位元組對齊
在用sizeof運算子求算某結構體所佔空間時,並不是簡單地將結構體中所有元素各自佔的空間相加,這裡涉及到記憶體位元組對齊的問題。從理論上講,對於任何 變數的訪問都可以從任何位址開始訪問,但是事實上不是如此,實際上訪問特定型別的變數只能在特定的位址訪問,這就需要各個變數在空間上按一定的規則排列,而不是...