c語言的位元組對齊
① 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語言位元組對齊怎麼操作
成為一名合格的IT人才
③ 關於C語言中的結構體位元組對齊
仔細看一下書中的說明吧,這三言兩語介紹起來有點累
或從網上查閱相關的技術資料,有詳細描述。
一般簡單來說,結構體從第一個變數開始檢查空間的「對齊位元組數」,
默認以第一個位元組大小作為對齊位元組數,如果遇上的下一個位元組與當前對齊位元組數不同時,就按兩者中較大的來進行結構體空間分配,接下來的對齊就全按此值來對齊,直到再遇上不同的才進行檢查或改變。
④ 什麼是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語言位元組對齊問題
看樣子跟你用的編譯器有關系,
你用的是gcc 什麼版本的,最新的是4.9吧
⑥ c語言如何分配16位元組對齊空間,共計1024位元組
structblock16
{
chardata[16];
};
structblock16*p=(structblock16*)malloc(1024);
⑦ 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語言的位元組對齊問題
問題沒說清,不過一般對齊方面都是指方便閱讀程序。一種不成文的規范
⑨ 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語言位元組對齊
應該是把A當成了 char 和 int 類型來進行對齊吧