程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 字節對齊總結

字節對齊總結

編輯:C++入門知識

1.字節對齊的緣由?

一句話說就是提高存取效率,存取效率與機器相關,比如有的機器總是從偶數字節開始取數據;同時,存取效率也和數據類型相關,比如如果取一個整型數字時,若能夠一次取出來肯定是最好,但是若由於機器取數據總是從偶數字節開始這個原因花了兩次訪問,那麼肯定會降低效率了。

2.字符對齊中的一些概念?

  • #pragma pack(n):表示顯式聲明機器的對齊字節為n,我們記這個數字為MA,每個機器都有默認的MA,剛才那句話的意思是改變MA,要恢復系統默認MA,語法是#pragma pack()
  • 有效對齊字節:以結構體為例進行分析,對於結構體中每個成員,它本身字節對齊要求至少得滿足起始地址是本身大小的整數倍,但是如果MA小於它本身大小,那麼要求對齊數為MA,在任何需要對齊的地方,有效對齊字節=min(MA,數據對齊字節)
  • 什麼時候需要對齊?對於結構體,其每一個成員需要對齊,最後整個結構體的大小也需要對齊

3.對齊的原則(以結構體為例)

  • 對於結構體中每一個元素,對齊大小為min(MA,自身大小)
  • 結構體的首地址必須與min(MA,結構體中最大體積元素大小)對齊,注意不是min(MA,結構體大小)
  • 結構體最終大小需為min(MA,結構體中最大體積大小)對齊
  • C編譯器缺省的結構成員自然對界條件為“N字節對齊”,N即該成員數據類型的長度。即如果不用#pragma pack(n) ,那麼相當於n無窮大

另外二種種說法:

image

image

4.需要注意的是,sizeof函數取的是占用的棧空間,因此static 成員不會計算在內。

主要參考:1.字節對齊(強制對齊以及自然對齊)  2.對齊實例(包括union)

PS:這個總結只是為自己總結的,所以我只圖自己方便了,所以可能講得不是很詳盡,當然,如果大家看到了有些幫助那做好不過了,如果有些講得不對的地方,請指出來。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved