c語言位元組對齊問題(一)

2021-06-09 05:35:56 字數 1358 閱讀 6857

在這裡只總結結構體的位元組對齊問題,

看下面的結構體

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劃分的,從理論上講似乎對任何型別的變數的訪問可以從任何位址開始,但實際情況是在訪問特定型別變數的時候經常在特 定的記憶體位址訪問,這就需要各種型別資料按照一定的規則在空間上排列,而不是順序的乙個接乙個的排放,這就是對齊。基本資料型別自身對齊,也叫自然對齊。就是說...