想用結構體來存儲一些數據(Objective-c環境下),結構體以下:spa
typedef struct { char itemName; char imageNameSel; char imageNameDis; BOOL isSelOrDis; } StructTest1;
那若是itemName是NSString類型的,結構體以下:code
1 typedef struct { 2 __unsafe_unretained NSString * itemName; 3 __unsafe_unretained NSString * imageNameSel; 4 __unsafe_unretained NSString * imageNameDis; 5 BOOL isSelOrDis; 6 } StructTest2;
以後,我想把幾個結構體對象放入一個NSArray裏的時候,想知道他們分別佔用的內存空間多大。對象
通過驗證,sizeof(StructTest1)等於4,sizeof(StructTest2)等於32,單獨理解起來都不是很難,char 類型佔1位,BOOL佔一位,NSString佔8位。可sizeof(StructTest2)等於32,Why?沒錯,BOOL也佔了8位,可在StructTest1結構體中只佔了1位,這裏就涉及到了一個概念,字節對齊。blog
百科裏是這樣解釋的:內存
爲何須要字節對齊計算機組成原理教導咱們這樣有助於加快計算機的取數速度,不然就得多花指令週期了。爲此,編譯器默認會對結構體進行處理(實際上其它地方的數據變量也是如此),讓寬度爲2的基本數據類型(short等)都位於能被2整除的地址上,讓寬度爲4的基本數據類型(int等)都位於能被4整除的地址上,以此類推。這樣,兩個數中間就可能須要加入填充字節,因此整個結構體的sizeof值就增加了。編譯器
暫時理解了這麼多,之後有新的認識了再補充。it
以上。編譯