【内存字节】深入理解sizeof占位内存

核能气质少年 提交于 2019-12-06 20:28:17

###运行代码 让计算机告诉你数据类型站内存情况

//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_64

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

字节对齐

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!