結構體大小的計算方法
相信來看這里的小伙伴們,應該都知道了計算一些基本型別的資料的大小,
比如,int 占4個位元組 ,char 占1個位元組 ,short 占2個位元組等等,那么結構體的大小怎么計算呢?
要想知道結構體大小是怎么計算的,我們必須知道結構體的對齊規則,對齊規則主要包括一下4點:
1.第一個成員在與結構體變數偏移量為0的地址處,
2.其他成員變數要對齊到對齊數的整數倍的地址處,對齊數 = 編譯器默認的一個對齊數與該成員大小的較小值, VS中默認的值為8
3.結構體總大小為最大對齊數(每個成員變數都有一個對齊數)的整數倍,
4.如果嵌套了結構體的情況,嵌套的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數(含嵌套結構體的對齊數)的整數倍,
(重點看我代碼里面注釋的分析是怎么計算的)
可能看了這4條規則你還是不懂怎么計算,下面我來舉幾個列子:(會在代碼里面注釋是怎么算的)
//看看這個結構體的大小為多少呢?
struct S1
{
//首先我們知道char 占一個位元組
char c1; //那么首先遵從第一條規則,就是從0開始算起,然后char占一個字
//節,所以這里就是為1了;
int a;//然后int占4個位元組,本來要從第二個位元組開始算,
//但我們先看看上面第二條規則,
//要對齊到對齊數的整數倍的地址處來開始計算,
//這里的對齊數為4,因為4比8小,所以我們
//要從第四個位元組來開始計算,加上int的4個位元組就是4+4=8了
char c2;// c2也占一個位元組 8為1的整數倍,所以這里只要直接加1就好了,
//就是9了
//那么到這里是不是就結束了呢?結構體大小就是9?
//當然不是的 接著我們看第3條規則結構體大小要為最大對齊數的整數倍
//顯而易見這個結構體的最大對齊數為4
//所以這個結構體的大小就要把9擴大到4的整數倍 就是12了
//所以這個結構體大小為12了,
};
看懂了上面是怎么計算的接下來再看看下面這個
struct S2
{
char c1;
char c2;
int a;
};
先自己計算一下這個結構體大小為多少?
S2結構體的大小為:8
為什么是8呢? 我再來分析一個:
首先同樣是從0開始計算,第一個為char型別,所以應該加1,然后第二個也是一個char型別,這時的最對齊數為1與8中的較小值, 所以對齊數就為 1了,所以這里是直接加1 就好, 然后為int型別占4個位元組,對齊數為4,所以我們要從4的整數倍開始計算, 那就是從4開始往后加4就為8,接下來要判斷8是不是這個結構體中的最大對齊數的整數倍呢,這個結構的最大對齊數為4,8是4的倍數,所以這個結構體的大小就是8了,
struct S3
{
double d; //8
char c; //8+1=9
int i ; //12+4=16
};
結構體S3的大小為:16 ,
這個結構體大小怎么計算,你們也可以自己好好分析一下,我也在代碼中簡單注釋了一下怎么算的
接下來看看這個結構體
struct S4
{
char c; //1
struct S3 s3; //8+16=24
double d;//24+8=32
}
S4這個結構體中包含了上面S3這個結構體,這個時候就要看看上面對齊規則的第4條規則了,
結構體S3中的最大對齊數為8 所以計算到結構體s3時,要從8開始計算所以是8+16=24;剛好24又為下一個double型別的對齊數(8)的整數倍,所以直接加8就為32 ,32又剛好是最大對齊數8的整數倍,所以S4結構體的大小就為32了,
上面都看完了的話,結構體大小的就算基本就沒什么問題了哦,希望總結的這些能幫到你,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/286718.html
標籤:其他
