⑴ C語言內存對齊問題.
為了有助於加快計算機的取數速度,編譯器默認會對結構體進行處理(實際上其它地方的數據變數也是如此),讓寬度為2的基本數據類型(short等)都位於能被2整除的地址上,讓寬度為4的基數據類型(int等)都位於能被4整除的地址上,以此類推。這樣,兩個數中間就可能需要加入填充位元組,所以整個結構體的sizeof值就增長了。
位元組對齊的細節和編譯器實現相關,但一般而言,滿足三個准則:
1) 結構體變數的首地址能夠被其最寬基本類型成員的大小所整除;
2) 結構體每個成員相對於結構體首地址的偏移量(offset)都是成員大小的整數倍,如有
需要編譯器會在成員之間加上填充位元組(internal adding);
3) 結構體的總大小為結構體最寬基本類型成員大小的整數倍,如有需要編譯器會在最末一
個成員之後加上填充位元組(trailing padding)。
你這里struct的首地址要能被double的8位元組整除,
char佔1位元組
int要被此時的地址整除,那麼需要補上3位元組,所以這里一共該是8位元組
short2位元組的,一共10位元組,不滿足3),不能整除int,故添加2位元組
最後是double 8位元組,這里地址應該是首地址+12不能被8整除,所以+4位元組。最後一共24B!
問題解決求採納!
⑵ 求助關於C語言結構體對齊的問題
數據對齊是和編譯器息息相關的。編譯器不同可能會導致結果的不同。
你算得沒錯,一般在計算的時候,我們都會按照通常講的對齊方式來算,所以本題是32,在vc++6.0上也是這個結果。
⑶ 關於C語言中的結構體位元組對齊
仔細看一下書中的說明吧,這三言兩語介紹起來有點累
或從網上查閱相關的技術資料,有詳細描述。
一般簡單來說,結構體從第一個變數開始檢查空間的「對齊位元組數」,
默認以第一個位元組大小作為對齊位元組數,如果遇上的下一個位元組與當前對齊位元組數不同時,就按兩者中較大的來進行結構體空間分配,接下來的對齊就全按此值來對齊,直到再遇上不同的才進行檢查或改變。
⑷ 在arm中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++來說:
int
4位元組
char
1位元組
float
4位元組
long
4位元組
double
8位元組
而對於gcc的編譯器來說
double佔12位元組!
⑹ C語言位元組對齊怎麼操作
成為一名合格的IT人才
⑺ 怎麼查看c++編譯器是幾位元組對齊
給你個詳細的參考。。看了就應該可也明白了。。太亂的話。。直接看參考資料給的鏈接吧。。C/C++內存對齊一、什麼是位元組對齊,為什麼要對齊? 現代計算機中內存空間都是按照byte劃分的,從理論上講似乎對任何類型的變數的訪問可以從任何地址開始,但實際情況是在訪問特定類型變數的時候經常在特 定的內存地址訪問,這就需要各種類型數據按照一定的規則在空間上排列,而不是順序的一個接一個的排放,這就是對齊。 對齊的作用和原因:各個硬體平台對存儲空間的處理上有很大的不同。一些平台對某些特定類型的數據只能從某些特定地址開始存取。比如有些架構的CPU在訪問 一個沒有進行對齊的變數的時候會發生錯誤,那麼在這種架構下編程必須保證位元組對齊.其他平台可能沒有這種情況,但是最常見的是如果不按照適合其平台要求對 數據存放進行對齊,會在存取效率上帶來損失。比如有些平台每次讀都是從偶地址開始,如果一個int型(假設為32位系統)如果存放在偶地址開始的地方,那 么一個讀周期就可以讀出這32bit,而如果存放在奇地址開始的地方,就需要2個讀周期,並對兩次讀出的結果的高低位元組進行拼湊才能得到該32bit數 據。顯然在讀取效率上下降很多。二、請看下面的結構:struct MyStruct { double dda1; char dda; int type }; 對結構MyStruct採用sizeof會出現什麼結果呢?sizeof(MyStruct)為多少呢?也許你會這樣求: sizeof(MyStruct)=sizeof(double)+sizeof(char)+sizeof(int)=13 但是當在VC中測試上面結構的大小時,你會發現sizeof(MyStruct)為16。你知道為什麼在VC中會得出這樣一個結果嗎? 其實,這是VC對變數存儲的一個特殊處理。為了提高CPU的存儲速度,VC對一些變數的起始地址做了「對齊」處理。在默認情況下,VC規定各成員變數存放的起始地址相對於結構的起始地址的偏移量必須為該變數的類型所佔用的位元組數的倍數。下面列出常用類型的對齊方式(vc6.0,32位系統)。 類型 對齊方式(變數存放的起始地址相對於結構的起始地址的偏移量) Char 偏移量必須為sizeof(char)即1的倍數 int 偏移把type
⑻ c語言結構體對齊的問題。
structdata 是8位元組對齊
{intcat; 4
inta[5]; 4*5=20
doubledog; 8
}size是32 32剛好是8的倍數
structdata 8位元組對齊
{intcat; 4
inta[6]; 4*6=24
doubledog; 8
},size是40.
要是說數據對齊估計你想像不來
你就這么記 真實大小要湊成幾位元組對齊那個幾的倍數
例如第二個真實是36 而比36大的8的倍數最近的就是40
畫圖的話我試著畫一個
⑼ 編譯器位元組對齊對針指參數有關嗎
非main函數裡面分配的局部變數時候是 以四位元組對齊的
⑽ keil編譯器中如何使代碼位元組對齊
tab 鍵縮進,可以設置自動縮進,寫得代碼好看,有靠你自己!