内存优化与编译优化

作为程序员,我们在开发时,尤其是在写业务的过程中,我们大都不关系编译器做了什么,其实编译器帮我们做了很多工作。这篇文章很浅显的分析下内存优化与编译优化。这里很推荐一本书《程序员的自我修养》,对于我们了解程序从编译、链接到执行很有帮助,虽然还没有啃完。

内存优化

了解了对象的创建过程,现在我们来看看对象的成员变量在内存中是如何分布的。

还是以 SMPerson 为例,这次我们新加了一个 char 类型的字段:

@interface SMPerson : NSObject

@property (nonatomic, copy) NSString *name; // 8 bytes
@property (nonatomic, copy) NSString *address; // 8 bytes
@property (nonatomic, assign) int age; // 4 bytes
@property (nonatomic, assign) CGFloat height; // 8 bytes
@property (nonatomic, assign) char ch1; // 1 byte
@property (nonatomic, assign) char ch2; // 1 byte

@end

我们分析,SMPerson 需要的内存空间仍是 40 字节,开辟的内存空间是 48字节。

对于 intchar 类型,OC 会自动帮我们进行内存优化。

var_display.png

编译优化

编译优化一般是编译器完成的,在开发过程中,一般我们都是在 debug 模式下,debug 模式下我们可以打印一些日志,开启僵尸对象等。在 debug/release 模式下编译后的汇编代码也有所不同:

int add(int a, int b) {
return a + b;
}

int main(int argc, const char * argv[]) {
@autoreleasepool {
int r = add(10, 5);
NSLog(@"a + b = %d", r);
}
return 0;
}

optinmization.png

能够明显的看出,release 模式下的汇编代码更短。

我们可以在 build setting -> Optimization Level 查看:

optimization_level.png

release 模式下默认开启编译优化。

编译优化可以减少编译时间、链接时间、运行时间等。