【內存字節】深刻理解sizeof佔位內存

###運行代碼 讓計算機告訴你數據類型站內存狀況node

//32位系統,地址長度是32位(bit),也就是4Byte 64位系統,地址長度是64位(bit),也就是8Byte
//注意 1byte = 8 bit;sizeof byte
#import <Foundation/Foundation.h>

int main(int argc, char *argv[]) {
	@autoreleasepool {
		char a[] = "go swift"; //自動爲末尾加上'/0',注意空格也要佔字節
		char b[14] = "go swift";
		char *c = a;
		char *d = "01234";
		int16_t t16;
		int32_t t32;
        int64_t t64;
		NSLog(@"%ld", sizeof(a));
		NSLog(@"%ld", sizeof(b));
		NSLog(@"%ld", sizeof(c));
		NSLog(@"%ld", sizeof(d)); //d是指向字符串常量的字符指針
		NSLog(@"%ld", sizeof(*d)); //*d是第一個字符 (所佔大小由數據類型決定)
    	NSLog(@"int type: %ld,%ld,%ld,%ld", sizeof(t16),sizeof(t32),sizeof(t64),sizeof(&t16)); 
	}
}

###執行結果x86_64swift

2016-06-12 10:51:06.651 goswift[36141:474463] 9
2016-06-12 10:51:06.652 goswift[36141:474463] 14
2016-06-12 10:51:06.652 goswift[36141:474463] 8
2016-06-12 10:51:06.652 goswift[36141:474463] 8
2016-06-12 10:51:06.652 goswift[36141:474463] 1
2016-06-12 10:59:41.724 goswift[37006:485097] int type: 2,4,8,8

###計算字符串 佔多少byte佈局

NSString *str=@"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
NSUInteger bytes = [str lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"%lu bytes", bytes);

###內存對齊操作系統

結構體的內存佈局依賴於CPU操做系統編譯器及編譯時的對齊選項指針

//內存對齊,簡單的說訪存總線的位數固定,以32位總線爲例,地址總線的地址老是4對齊的,因此數據也四對齊的話
struct node1{
    char a;//32位機 佔1個字節
    int  b;//32...   4個字節
};

sizeof(node1)// 結果等於8

struct node2{
    int  a;
    int  b;
};

sizeof(node2)// 結果等於8

字節對齊

字節對齊

相關文章
相關標籤/搜索