本文爲本人另一個賬號上的文章,那個賬號不要了,乾坤大挪移過來。
最近遇到結構體內存對齊的問題,發現自己一知半解,於是在網上搜集了些資料,總結如下。
一、規則
- 數據成員對齊:每個結構體成員所分配的存儲位置與起始點的偏移量必須能夠整除min(對齊係數,成員字節數)。
- 結構(或聯合)的整體對齊:整個結構體所佔存儲空間要能整除min(max(成員字節數),對齊係數)。
二、實例說明
(一)對齊係數爲2
#pragma pack(2)
struct test_t
{
int a; /* 長度4 > 2 按2對齊;起始offset=0 0%2=0;存放位置區間[0,3] */
char b; /* 長度1 < 2 按1對齊;起始offset=4 4%1=0;存放位置區間[4] */
short c; /* 長度2 = 2 按2對齊;起始offset=6 6%2=0;存放位置區間[6,7] ,前面空了一個字節*/
char d; /* 長度1 < 2 按1對齊;起始offset=8 8%1=0;存放位置區間[8] */
};
#pragma pack()
#pragma pack(2)
struct test_t
{
int a; /* 長度4 > 2 按2對齊;起始offset=0 0%2=0;存放位置區間[0,3] */
char b; /* 長度1 < 2 按1對齊;起始offset=4 4%1=0;存放位置區間[4] */
char d; /* 長度1 < 2 按1對齊;起始offset=8 8%1=0;存放位置區間[5] */
short c; /* 長度2 = 2 按2對齊;起始offset=6 6%2=0;存放位置區間[6,7] */
};
#pragma pack()
整體大小(size)=$(成員總大小) 按 $(整體對齊係數) 圓整 = 8 /* 8%2=0 */
(二)對齊係數爲8
#pragma pack(8)
struct test_t
{
int a; /* 長度4 < 8 按4對齊;起始offset=0 0%4=0;存放位置區間[0,3] */
char b; /* 長度1 < 8 按1對齊;起始offset=4 4%1=0;存放位置區間[4] */
short c; /* 長度2 < 8 按2對齊;起始offset=6 6%2=0;存放位置區間[6,7] ,前面空一個字節*/
char d; /* 長度1 < 8 按1對齊;起始offset=8 8%1=0;存放位置區間[8] */
};
#pragma pack()
整體大小(size)=$(成員總大小) 按 $(整體對齊係數) 圓整 = 12/* 12%4=0 */