object-c 对象内存分配
@interface BusinessCard2 : NSObject
@property (nonatomic) int _age;
@property (nonatomic) Byte _padding; //放在这里会让对象分配内存空间时多分16字节=》alloc(32字节)
@property (nonatomic, retain) NSString *_firstName;
@property (nonatomic) Byte _b1;
@end;
@implementation BusinessCard2
- (void)dealloc{
[__firstName release];
}
@end
测试:
BusinessCard2 *card2 = [[BusinessCard2 alloc] init];
card2._firstName = @"adfadsfds";
NSLog(@"===BusinessCard2 size==%d", malloc_size(card2));
分析:对象实例初始化后,在内存中格局如下:
实例对象预留 (4字节) + age(int 4字节) + byte(1字节,以及系统内存对齐要补全的3字节) + nsstring(*指针4字节) + 3个byte(3字节) ==》sum(17字节),但因为对象分配内存按16字节增加,所以补充成32字节。
如下用下面方式:
@interface BusinessCard2 : NSObject
@property (nonatomic) int _age;
@property (nonatomic, retain) NSString *_firstName;
@property (nonatomic) Byte _padding; //如放在这里的话,因为内存分配对齐的原则,仅分配16字节=》alloc(16字节)
@property (nonatomic) Byte _b1;
@property (nonatomic) Byte _b2;
@property (nonatomic) Byte _b3;
@end;
@implementation BusinessCard2
- (void)dealloc{
[__firstName release];
}
@end
实例对象预留 (4字节) + age(int 4字节) + nsstring(*指针4字节) + 4个byte(4字节,因为相联,所以用4字节存储,不再考虑内存对齐问题) ==》sum(16字节)。
补充:short分配为2(字节)
因为object-c中使用的都是指针类型实例对象,所以全部为4字节。但如果像上面例子使用了基本C的类型,就要考虑内存对齐的问题了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
2008-05-29 推荐一个基于Microsoft ASP.NET MVC Preview 2 的应用示例
2008-05-29 DinnerNow中的Work Flow应用(下) --- 订单流程