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

本文通过代码示例解析了数据类型在内存中的存储情况,揭示了为何大部分程序员在迈向架构师之路时面临挑战。从基本数据类型大小到字符串占内存的计算,再到内存对齐原理,深入浅出地解释了这一现象背后的逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

字节对齐

字节对齐

转载于:https://my.oschina.net/kshopping/blog/685506

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值