結構體對齊問題

2021-07-29 20:10:02 字數 778 閱讀 9624

昨天華為面試,問到了關於結構體對齊的問題。我懵逼了,結構體對齊是什麼梗?一開始還以為是和資源受限的裝置(微控制器啊之類的嵌入式裝置)開發有關。

今天下了下資料,發現原理是真的簡單,當時多考慮一會應該能想出來的。

struct struct_a;
在計算機記憶體中,結構體變數的儲存通常是按字長對齊的,比如8位機裡就按位元組對齊,那麼上述結構體共占用1+4+2+8=15byte。

在16位機裡,變數就按照2位元組對齊,比如a這個成員,雖然是個char型別,位址在0x80000000本身只佔1位元組,但是下乙個成員b卻不能使用0x80000001這個位址,而必須使用0x80000002,這就是按字長對齊。以上結構體占用的空間也就是2+4+2+8=16位元組

同理,在32位機中,如果a在0x80000000的話,b只能放在0x80000004,因為這裡的字長是4個位元組。以上結構體占用空間4+4+4+8=20位元組

也就是說總有一些位元組是浪費掉的,這樣做的目的很簡單,就是因為在大多數計算機體系結構中,對記憶體操作時按整字訪問才能達到最高效率,相當於是以空間換取時間。當然在某些計算機體系結構中,比如arm,是支援非對齊字傳輸的,也就是說變數並不一定要按照字長對齊,儘管這樣可能會降低效率,但換來的是儲存空間上的節約。對於程式設計師來講,則需要將結構體宣告為緊湊型結構體。宣告的關鍵字依編譯器不同而異,你可以去查一下__packed關鍵字,可以得到更詳細的說明。使用緊湊型結構體,則會強制編譯器將結構體成員按1位元組對齊,則以上結構體占用空間仍為15位元組。

所以這裡關鍵是在網上深處想,往計組和微機方向考慮一下應該不難想出來。

結構體對齊問題

1,比如 structa structb sizeof a 6,sizeof b 8,為什麼?注 sizeof short 2,sizeof long 4 因為 成員對齊有乙個重要的條件,即每個成員按自己的方式對齊.其對齊的規則是,每個成員按其型別的對齊引數 通常是這個型別的大小 和指定對齊引數 這...

結構體位元組對齊問題

結構體 struct 的sizeof值,並不是簡單的將其中各元素所佔位元組相加,而是要考慮到儲存空間的位元組對齊問題。先看下面定義的兩個結構體.struct s1 struct s2 分別用程式測試得出sizeof s1 6 sizeof s2 4 可見,雖然兩個結構體所含的元素相同,但因為其中存放...

結構體的大小 結構體對齊問題

c語言中,基本資料型別與作業系統有關 雖然直接與編譯器相關 基本沒有什麼變化。比如在32位作業系統中,int佔4個位元組,long佔4個位元組,char佔1個位元組,double佔8個位元組。但是結構體的大小並不只與作業系統有關了,與編譯器有比較大的關係。不同的編譯器有不同的對齊方式,下面以32為l...