在這裡只總結結構體的位元組對齊問題,
看下面的結構體
struct s1 {
char a;
int b;
short c; };
struct s2 {
char a;
short c;
int b; };
那麼sizeof(s1) = 12, sizeof(s1) = 8;
我們可以假定結構體在記憶體中的位址是0x0000開始的,那麼我們說的位元組對齊就是(起始記憶體位址%自身型別位元組) = 0;
所以在這裡簡單分析下s1是怎麼對齊的
a的記憶體位址是0x0000,自身位元組1,它是自然對齊的,
b的自身型別位元組是4,如果要對齊,那麼起始位址只能是0x0004,範圍到0x0007.
c的自身型別位元組是2,故起始位址為0x0008,範圍到0x0009故不用填充了直接跟在b變數後面,
為什麼還要補全兩個位元組呢,因為假定這是乙個結構體陣列,那麼,下個元素的起始位址是不是也要對齊,所以不管後面有沒有變數,都要記憶體對齊,才不會對後面的變數產生位元組不對齊的影響,並且結構體最後補全的位元組數取決於變數的最大型別的整數倍,即,在上面是int佔四位元組,所以結構體的記憶體必然是4的倍數
當結構體中有char a[0]成員,這樣的成員時,這是不會增加結構體內存的,但是a的位址是上面那個成員的位址加一,也就是a後面的成員的位址
補充:對於改變指定位元組的方法有幾種 一.
#pragma pack (n) //n就是指定的位元組
struct ss;
#pragma pack () //取消指定位元組
二. struct ss
__attribute__ ((packed)); //指定最小位元組對齊,乙個位元組
三. struct stu__attribute__ ((aligned (1))); //數字為指定乙個位元組
在這裡說一下,這是筆者自己的理解,對於不同平台有不同的規定,像x86平台,位元組不對齊只是影響cpu讀取記憶體的速度,但是有些平台必須嚴格對齊,不然會傳送錯誤。這麼說那麼就是說cpu也不是按程式設計師想象那樣,int型的就一次去取int型所占有的位元組數,而是按照變數儲存在記憶體中什麼位置來決定取的次數,接著才是取多少個位元組,有不同看法的請指教
補充:如果能分析下面的結構體內存,你就真懂了位元組對齊
struct aa
;struct bb
;int g;
};結果是sizeof(aa) = 16; sizeof(bb) = 32
c語言位元組對齊問題(二)
struct s 那麼sizeof s 4 先說下位域在記憶體對齊的一些規則 2.位域的多少定義多少就後面接多少位,但是位域要求是連續的位元組,像a已經占有4位了,乙個位元組8位,那麼就會填補4位,到下個位元組,所以到b變數占用的是另個一新位元組。3.對於一些資料說位域不能跨兩個位元組,就是說位域長...
C語言位元組對齊問題詳解
引言 考慮下面的結構體定義 typedef struct t foo int main void 複製 執行後輸出 c1 0,s 2,c2 4,i 8為什麼會這樣?這就是位元組對齊導致的問題。一 什麼是位元組對齊 現代計算機中,記憶體空間按照位元組劃分,理論上可以從任何起始位址訪問任意型別的變數。但...
c語言位元組對齊
現代計算機中記憶體空間都是按照byte劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。基本資料型別自身對齊,也叫自然對齊。就是說...