首先把結(jié)構(gòu)體中的內(nèi)存對齊的規(guī)則梳理一下:
1、結(jié)構(gòu)體中的第一個成員存放的首地址是零偏移處
2、結(jié)構(gòu)體成員數(shù)據(jù)存放的首地址必須是有效對齊參數(shù)的整數(shù)倍,而有效對齊參數(shù)是系統(tǒng)默認對齊參數(shù)和數(shù)據(jù)自身對齊參數(shù)兩者中的最小值
3、結(jié)構(gòu)體的大小必須是所有成員中的大有效對齊參數(shù)的整數(shù)倍
4、結(jié)構(gòu)體在內(nèi)存中是按照順序存放的
特別注意對齊是相對于結(jié)構(gòu)體變量首地址(即第一個成員存放的首地址)來說的,舉個例子:
我們定一個結(jié)構(gòu)體變量如下
struct _test_st
{
uint08 a;
uint32 b;
uint16 c;
}test_st;
結(jié)構(gòu)體變量test_st成員a存放在偏移量為0的地址中,由于對齊規(guī)則,b就存放在偏移量為4的地址中,c就存放在偏移量為8的地址中(后面會具體分析)。
接下來進入實戰(zhàn)分析。
下面按照系統(tǒng)默認4字節(jié)對齊來講述。
我們定義3個結(jié)構(gòu)體變量:
typedef struct _test_st_1
{
uint08 a1;
uint32 b1;
uint16 c1;
}test_st_1;
typedf struct _test_st_2
{
uint08 a2;
test_st_1 b2;
uint16 c2;
}test_st_2;
typedef struct _test_st_3
{
uint08 a3;
uint64 b3;
uint16 c3;
}test_st_3;
test_st_1 st1;
test_st_2 st2;
test_st_3 st3;
uint08 array[48];
uint08 len_1
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧