sizeof之字節對齊/內存對齊

想用結構體來存儲一些數據(Objective-c環境下),結構體如下:

typedef struct {
    char itemName;
    char imageNameSel;
    char imageNameDis;
    BOOL isSelOrDis;
} StructTest1;

那如果itemName是NSString類型的,結構體如下:

typedef struct {
     __unsafe_unretained NSString * itemName;
     __unsafe_unretained NSString * imageNameSel;
     __unsafe_unretained NSString * imageNameDis;
     BOOL isSelOrDis;
 } StructTest2;

之后,我想把幾個結構體對象放入一個NSArray里的時候,想知道他們分別占用的內存空間多大。經過驗證,sizeof(StructTest1)等于4,sizeof(StructTest2)等于32,單獨理解起來都不是很難,char 類型占1位,BOOL占一位,NSString占8位。可sizeof(StructTest2)等于32,Why?沒錯,BOOL也占了8位,可在StructTest1結構體中只占了1位,這里就涉及到了一個概念,字節對齊。

百科里是這樣解釋的:為什么需要字節對齊計算機組成原理教導我們這樣有助于加快計算機的取數速度,否則就得多花指令周期了。為此,編譯器默認會對結構體進行處理(實際上其它地方的數據變量也是如此),讓寬度為2的基本數據類型(short等)都位于能被2整除的地址上,讓寬度為4的基本數據類型(int等)都位于能被4整除的地址上,以此類推。這樣,兩個數中間就可能需要加入填充字節,所以整個結構體的sizeof值就增長了。

暫時理解了這么多,以后有新的認識了再補充。
以上。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容