OC底层实现_准备知识_04

(一)计算结构体struct需要的内存空间

#import 

// 定义一个三维的点结构体,名字叫 AA_Point
// Note:注意类型是 struct AA_Point
// 不要直接单独使用 AA_Point
struct AA_Point {
    int x;
    int y;
    int z;
};

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        NSLog(@"struct AA_Point  需要内存空间size:%lu", sizeof(struct AA_Point));
        
        // 创建一个点
        struct AA_Point point_1 = {3, 4, 5};
        
        NSLog(@"结构体变量 point_1 需要内存空间size:%lu", sizeof(point_1));
    }
    return 0;
}

打印结果如下:

struct AA_Point  需要内存空间size:12
结构体变量 point_1 需要内存空间size:12

在03节,我们已经验证了int需要4个字节,所以3个int类型,自然需要12个字节的内存空间,所以结构体类型struct AA_Point需要12个字节的内存空间.

(二)结构体指针变量

// 创建一个点
struct AA_Point point_1 = {3, 4, 5};
        
NSLog(@"结构体变量 point_1 需要内存空间size:%lu", sizeof(point_1));
        
struct AA_Point *p_AA_Point = &point_1;
        
NSLog(@"结构体变量 point_1 内存地址:%p", &point_1);
NSLog(@"结构体指针变量 p_AA_Point 内存地址:%p", &p_AA_Point);
NSLog(@"结构体指针变量 p_AA_Point 中的数据:%p", p_AA_Point);
NSLog(@"结构体指针变量 p_AA_Point 中的数据需要内存空间:%lu", sizeof(p_AA_Point));

打印结果如下:

结构体变量 point_1 内存地址:0x7ffeefbff500
结构体指针变量 p_AA_Point 内存地址:0x7ffeefbff4f8
结构体指针变量 p_AA_Point 中的数据:0x7ffeefbff500
结构体指针变量 p_AA_Point 中的数据需要内存空间:8

打印可以确认: p_AA_Point 中的数据就是变量 point_1 的内存地址. p_AA_Point 是不是自己也得有自己的地址.
结构体指针变量存放的是数据是内存地址,内存地址是64位机器下的,所以结构体指针变量就需要8个字节存储空间.

Note:在64位机器下,指针变量需要的内存空间都是8个字节,不管指向什么类型的变量.void * 可以指向任何类型,就是因为void *中的数据(内存地址数据)都是8个字节.

到这有点晕的小伙伴,最好再看看前面小节的内容,不然,就更晕了.

(三)结构体中有指针变量

结构体嵌套的内存空间计算,就请小伙伴们自己尝试一下了.

// 定义一个圆球结构体
struct AA_RoundBall {
    // 定义圆心, 是一个指针结构体变量
    struct AA_Point *circleCenter;
};

执行语句:

    struct AA_RoundBall roundBall = {p_AA_Point};

     NSLog(@"struct AA_RoundBall  需要内存空间size:%lu", sizeof(struct AA_RoundBall));
     NSLog(@"结构体变量 roundBall  需要内存空间size:%lu", sizeof(roundBall));

打印结果如下:

struct AA_RoundBall  需要内存空间size:8
结构体变量 roundBall  需要内存空间size:8

(四)struct AA_RoundBall指针变量

struct AA_RoundBall *p_AA_RoundBall = &roundBall;
        
NSLog(@"struct AA_RoundBall *  需要内存空间size:%lu", sizeof(struct AA_RoundBall *));
NSLog(@"结构体指针变量 roundBall  需要内存空间size:%lu", sizeof(p_AA_RoundBall));

打印结果如下:

struct AA_RoundBall *  需要内存空间size:8
结构体指针变量 roundBall  需要内存空间size:8

结构体成员变量含有指针变量,这个结构体又可以创建结构体指针变量.如果感觉很晕,本质上还是对指针变量的不理解.

PS: 指针变量首先它是一个变量,变量是不是得给它一个地址,放东西.这个东西有点特殊,是另一个内存地址.指针变量和普通变量都一样,都有一个地址,都需要一个内存空间放数据.

GitHub项目代码

你可能感兴趣的:(OC底层实现_准备知识_04)