对象的本质与结构体对齐内存原则

前言

我们平时编些的Objective-C,底层实现都是C/C++以及部分汇编代码编写的,Ojective-C高级语言通过编译器,生成CPU可以直接执行的机器语言。

Clang是一个由Apple主导编写,基于LLVM的C/C++/Objective-C编译器,它可以将Ojective-C编写的.m文件编译为C++编写的.cpp文件。

1.对象的本质

首先我们在terminal执行clang -rewrite-objc main.m -o main.cpp命令将下面代码的.m文件编译为.cpp文件

#import 
@interface ZFPerson:NSObject
@property (nonatomic,strong) NSString *nickName;
@end
@implementation ZFPerson

@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // insert code here...
        ZFPerson *person = [[ZFPerson alloc] init];
     }
    return 0;
}

注意:如果出现UIKit问题,可以尝试执行

clang -rewrite-objc -fobjc-arc -fobjc-runtime=ios-13.0.0 -isysroot 
 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator13.0.sdk main.m

言归正传,从编译后的.cpp文件中,我们可以发现ZFPerson对象变成了ZFPerson_IMPL,所以OC对象的本质是C++结构体

2.结构体内存对齐原则

1:数据成员对⻬规则:结构(struct)(或联合(union))的数据成员,第
一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要
从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,
结构体等)的整数倍开始(比如int为4字节,则要从4的整数倍地址开始存
储。 min(当前开始的位置mn)m = 9 n = 4 9 10 11 12

2:结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从
其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b
里有char,int ,double等元素,那b应该从8的整数倍开始存储.)

3:收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍.不足的要补⻬。

2.1 结构体

2.2 结构体嵌套结构体

3.3 基本数据类型对应的内存大小

你可能感兴趣的:(对象的本质与结构体对齐内存原则)