『壹』 c語言結構體長度位元組對齊問題
因為當結構體中有多個數據類型時,結構體的長度對齊是按數據類型長度最長的那個來對齊的,double類型佔8個位元組,所以每個成員變數都按8個位元組的長度來算,就是5*8=40,驗證程序如下:
#include<stdio.h>
structchji
{
charname[9];
intnumber;
charsex;
doublescore;
floataa;
};
structchjistu;
intmain()
{
printf("sizeof(structchji)=%d ",sizeof(structchji));
return0;
}
運行結果:sizeof(struct chji)=40
如果要按單個位元組的長度來對齊的話,代碼如下:
#include<stdio.h>
#pragmapack(1)
structchji
{
charname[9];//9
intnumber;//4
charsex;//1
doublescore;//8
floataa;//4
};
structchjistu;
#pragmapack()
intmain()
{
printf("sizeof(structchji)=%d ",sizeof(structchji));
return0;
}
運行結果:sizeof(struct chji)=26
即9+4+1+8+4=26,你可以查下#pragma pack()相關的資料的,就會清楚了。
『貳』 C語言位元組對齊問題
看樣子跟你用的編譯器有關系,
你用的是gcc 什麼版本的,最新的是4.9吧
『叄』 c語言,怎麼解決結構體位元組對齊問題或者說是否有一個函數能使未知結構體轉換成一位元組對齊的位元組數組
結構體中多定義一個無關的數據類型,這個數據類型的長度要和原有長度構成結構體的對齊
『肆』 C語言位元組對齊
應該是把A當成了 char 和 int 類型來進行對齊吧
『伍』 C語言結構體怎麼對齊按最大位元組對齊struct pp{int a;float b; doubl
24(按8位元組對齊,前面int和float合起來剛好8位元組+double8位元組+char補齊後8位元組=24)
如果是struct pp{int a;float b; char d}oo; sizeof(oo)就是12位元組,按4位元組對齊
『陸』 C語言位元組對齊問題
這個佔多少個位元組是不確定的!!!跟編譯器有關的!!
對於visual
c++來說:
int
4位元組
char
1位元組
float
4位元組
long
4位元組
double
8位元組
而對於gcc的編譯器來說
double佔12位元組!
『柒』 什麼是C語言結構體位元組對齊,為什麼要對齊
對齊跟數據在內存中的位置有關。如果一個變數的內存地址正好位於它長度的整數倍,他就被稱做自然對齊。比如在32位cpu下,假設一個整型變數的地址為0x00000004,那它就是自然對齊的。
需要位元組對齊的根本原因在於CPU訪問數據的效率問題。假設上面整型變數的地址不是自然對齊,比如為0x00000002,則CPU如果取它的值的話需要訪問兩次內存,第一次取從0x00000002-0x00000003的一個short,第二次取從0x00000004-0x00000005的一個short然後組合得到所要的數據,如果變數在0x00000003地址上的話則要訪問三次內存,第一次為char,第二次為short,第三次為char,然後組合得到整型數據。而如果變數在自然對齊位置上,則只要一次就可以取出數據。一些系統對對齊要求非常嚴格,比如sparc系統,如果取未對齊的數據會發生錯誤,舉個例:
char ch[8];
char *p = &ch[1];
int i = *(int *)p;
運行時會報segment error,而在x86上就不會出現錯誤,只是效率下降。
『捌』 c語言結構體位元組對齊(某馬)
但是實際上cpu將內存當成多個塊,每次從內存中讀取一個塊,這個塊的大小可能是2、4、8、16等。
那麼下面,我們來分析下非內存對齊和內存對齊的優缺點在哪?
內存對齊是操作系統為了提高訪問內存的策略。操作系統在訪問內存的時候,每次讀取一定長度(這個長度是操作系統默認的對齊數,或者默認對齊數的整數倍)。如果沒有對齊,為了訪問一個變數可能產生二次訪問。
至此大家應該能夠簡單明白,為什麼要簡單內存對齊?
『玖』 c語言結構體對齊的問題。
這是個好問題!
為什麼會有對齊的問題呢?簡單的說就是為了提高訪問內存的效率,這和CPU內部的機制有關,如果你想深入理解,需要閱讀 Intel 開發者手冊。對齊採用的總體原則是這樣的:4位元組變數的存放要對齊到可以被4整除的地址上,8位元組變數的存放要對齊到可以被8整除的地址上。其他變數類推就行了。如果沒對齊編譯器就會將某個變數的存儲往後推遲幾個位元組,以保證對齊後再存放。
具體到這個問題就是可以先假設結構體變數從地址0處開始存放,那麼第一種情況就是這樣的了:
cat 存放的位置是地址0-地址3
a數組存放的位置是地址4-地址23
dog存放的位置是地址24到地址31
這里可以看到它們都符合對齊的原則(即每個變數開始存放的地址可以除盡它們所佔的位元組數),所以是32
第二種情況是這樣的:
cat仍然存放到地址0-地址3處
a數組是地址4到地址27處
存放dog時編譯器計算除下一個地址28並不能除盡double的位元組數8,於是它要將地址進行遞增。29,30,31仍然不能除盡8,知道遞增到32時可以將8除盡了,所以dog變數會被存放在地址32到地址39處,從地址0到地址39正好40個位元組,這就解釋了第二種情況了。
ps. 其實你這個問題還有一種變種就是一個結構體里在套一個結構體,這時會牽扯到內部的結構體對齊的問題。等你以後遇見了再給我提問吧,我給你解釋。
『拾』 關於C語言中的結構體位元組對齊
仔細看一下書中的說明吧,這三言兩語介紹起來有點累
或從網上查閱相關的技術資料,有詳細描述。
一般簡單來說,結構體從第一個變數開始檢查空間的「對齊位元組數」,
默認以第一個位元組大小作為對齊位元組數,如果遇上的下一個位元組與當前對齊位元組數不同時,就按兩者中較大的來進行結構體空間分配,接下來的對齊就全按此值來對齊,直到再遇上不同的才進行檢查或改變。