本文目錄一覽:
關於C語言中的結構體位元組對齊
仔細看一下書中的說明吧,這三言兩語介紹起來有點累
或從網上查閱相關的技術資料,有詳細描述。
一般簡單來說,結構體從第一個變數開始檢查空間的「對齊位元組數」,
默認以第一個位元組大小作為對齊位元組數,如果遇上的下一個位元組與當前對齊位元組數不同時,就按兩者中較大的來進行結構體空間分配,接下來的對齊就全按此值來對齊,直到再遇上不同的才進行檢查或改變。
什麼是C語言結構體位元組對齊,為什麼要對齊
arm支持16bit和32bit的地址訪問,即變數地址能夠被2或4整除,這時性能比較好,也便於移植。結構體的對齊就是指的結構體內部的每個成員變數地址儘可能對齊到2或4位元組位置,如定義為:
struct{
char
ch1;
char
ch2;
short
ss;
int
i;
}var;
字元變數ch1,
ch2為位元組對齊,短整型變數ss為半字對齊,整型變數i為字對齊,結構體內的變數比較緊湊,且已自然對齊,結構體變數var佔用總空間為8個位元組。如果改為這樣:
struct{
char
ch1;
short
ss;
char
ch2;
short
ss;
int
i;
}var;
var變數最終佔用的空間為12個位元組,存取這個結構體時比前面那個需要的時間要多,另外如果用pack(1)指定結構體位元組對齊的話,後面的方式移植到其它系統可能會出現死機問題。
C語言位元組對齊問題
目前編譯器上(我是說visual c++)如果沒有特別設置的話, 默認的對齊方式按下面幾個規律
1. 每個成員對齊到它長度的整數倍
2. 整個結構的長度對齊到它最長成員長度的整數倍
3. 上面所說的長度,超過4的按4算。
就這個來說, b欄位會被對齊到2位元組位置, 最後整個會被對齊到6位元組長
我不知道這幾點是標準還是實現, 以後會不會有變化
C語言裡面的位元組對齊的計算方法能講解1下嗎?
首先你要知道為什麼會出現位元組對齊,這是一種用空間換時間的做法,因為對齊之後可以提高取數的效率。結構體的大小一般是4或者8的倍數,具體是以最大的變數類型的大小為基數的。也就是說在內存中,數據一般是放在一個4的整數倍的起始地址。
sturct S
{
char c;
short s;
int i;
}
它的大小是8個位元組,因為前面兩個佔了4位元組。如果寫成下面這種形式,它就是12位元組了
struct S
{
char c;
int i;
short s;
}
因為為了提高存取效率,所以第一個成員變數佔了四個位元組的空間,最後一個成員也佔了四個位元組
你非要說計算方法的話要根據具體情況來算了,首先看結構體中哪一個變數所佔的位元組數最大,然後後面的對齊計算都以這個為基數(我這裡以4位元組為例)。接著,你把每一個成員變數的大小依次相加(按照結構體定義中的順序,從第一個加到最後一個)。當你加到某一個變數的時候,發現超過了4個位元組,那麼就把這個變數之前的內容當作是一個整體,它們一共點4個位元組,後面的再繼續這個過程
C語言結構體長度位元組對齊問題
因為當結構體中有多個數據類型時,結構體的長度對齊是按數據類型長度最長的那個來對齊的,double類型佔8個位元組,所以每個成員變數都按8個位元組的長度來算,就是5*8=40,驗證程序如下:
#include stdio.h
struct chji
{
char name[9];
int number;
char sex;
double score;
float aa;
};
struct chji stu;
int main()
{
printf(“sizeof(struct chji)=%d\n”,sizeof(struct chji));
return 0;
}
運行結果:sizeof(struct chji)=40
如果要按單個位元組的長度來對齊的話,代碼如下:
#include stdio.h
#pragma pack(1)
struct chji
{
char name[9]; //9
int number; //4
char sex; //1
double score; //8
float aa; //4
};
struct chji stu;
#pragma pack()
int main()
{
printf(“sizeof(struct chji)=%d\n”,sizeof(struct chji));
return 0;
}
運行結果:sizeof(struct chji)=26
即9+4+1+8+4=26,你可以查下#pragma pack()相關的資料的,就會清楚了。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/254937.html