美文网首页
iOS 内存对齐:结构体继承和结构体作为另一个结构体成员变量情况

iOS 内存对齐:结构体继承和结构体作为另一个结构体成员变量情况

作者: huisedediao | 来源:发表于2021-02-04 18:38 被阅读0次

内存对齐规则就不赘述了,这里讨论下继承和结构体作为另一个结构体成员变量的情况下,结构体内如何进行内存对齐。以下测试基于iOS 64位环境(小端),对齐系数设置为8进行,请忽略测试中堆中指针指向栈中数据的安全问题。

先上结论:

1,不论是继承还是作为另一个结构体成员变量,计算有效对齐值时,用的是所有使用到的结构体中占用空间最大的那个变量所占的内存来计算。
/*----------------------------------------举例情况1----------------------------------------*/
#pragma pack(8)
struct Super {
    short a;
    char b;
    short c;
}; //有效对齐值为2

struct Sub : Super {
    char *d;
}; // 有效对齐值为8
#pragma pack()

/*----------------------------------------举例情况2----------------------------------------*/
#pragma pack(8)
struct Super {
    int a;
    char b;
    short c;
}; //有效对齐值为4

struct Sub : Super {
    char d;
}; // 有效对齐值为4
#pragma pack()
2,继承的情况下,父类进行内存布局时,父类中的成员变量,按照父类中的对齐规则进行布局。子类进行内存布局时,把父类对齐过后所占的内存空间当作一个整体(不可以再对父类内存布局进行修改),再与子类中定义的成员变量,根据内存对齐规则进行布局。
/*----------------------------------------举例情况1----------------------------------------*/
#pragma pack(8)
struct Super {
    short a;
    char b;
    short c;
}; //有效对齐值为2

struct Sub : Super {
    char *d;
}; // 有效对齐值为8
#pragma pack()
image.png
3,作为另一个结构体成员变量的情况和继承类似,例如现在有a、b两个结构体,b中有一个成员变量为a类型。在b进行内存对齐时,把a对齐过后所占的内存空间当作一个整体,再与b中其他成员变量,根据内存对齐规则进行布局。

从设计上来理解:

1,编译器肯定是以预设的数据类型来计算有效对齐值的,我们自己写的结构体,取其中预设的数据类型来计算。如果按照我们自己写的结构体大小来计算有效对齐值,那么绝大部分情况计算出来都与系统的对齐系数相等。
2,我们自己写的结构体(a),如果放到其他结构体(b)中使用,a所占空间是不能改动的。如果改动了,会造成单独使用a和在b中使用a时,a占用的空间不一致。例如下面的例子,单独使用Super的时候,Super占4个字节。如果Sub对齐的时候结合Super的成员变量重新对齐,那么对齐后Sub所占用的内存应该为4个字节,Super中的变量占3个字节,Sub中新定义的变量占1个字节,这样前后矛盾了。实际打印结果为6个字节。


image.png image.png image.png

继承同理:


image.png image.png

测试:(以继承为例,结构体作为另一个结构体成员变量的情况类似)

maxSuper = 父类中占内存最大的那个成员变量所占内存
maxSub = 子类中占内存最大的那个成员变量所占内存

1,maxSuper > maxSub的情况

image.jpeg image.jpeg image.jpeg image.jpeg

2,maxSuper < maxSub的情况

image.jpeg image.jpeg image.jpeg image.jpeg

相关文章

  • iOS 内存对齐:结构体继承和结构体作为另一个结构体成员变量情况

    内存对齐规则就不赘述了,这里讨论下继承和结构体作为另一个结构体成员变量的情况下,结构体内如何进行内存对齐。以下测试...

  • 结构体

    结构体有名定义 无名定义 结构体嵌套定义 结构体内存对齐 结构体成员初始化 结构体变量引用 结构体的有名定义:直白...

  • 内存对齐详解

    1、什么是内存对齐假设我们声明两个变量: 2、结构体内存对齐规则 结构体所占用的内存与其成员在结构体中的声明顺序有...

  • C语言基础掌握之day6

    结构体,联合体,枚举与typedef 结构体 定义结构体和初始化 访问结构体成员:实例化变量.成员变量 如:m....

  • 从结构体内存对齐到OC对象内存对齐

    1、结构体内存对齐 结构体对齐规则:1:数据成员对⻬规则:结构(struct)(或联合(union))的数据成员,...

  • 结构体

    1.结构体 2.结构体的内存对齐模式 编译器在编译一个结构的时候采用内存对齐模式,结构体总是以最大的成员最为对齐单...

  • 结构体内存对齐

    结构体内存对齐的规则:1、第一个成员变量在结构体变量偏移为0的地址处2、其他成员变量或者成员的子成员变量要对齐到“...

  • C语言结构体指针与结构体变量作形参的区别

    区别 结构体变量 结构体变量作为形参,传递的是结构体变量本身,是一种值传递 形参结构体变量成员值的改变不影响对应的...

  • 结构体

    结构体定义* 结构体中的格式:* struch 结构体名* {* 结构体成员变量* }* 结构体中的特点* 1.结...

  • C语言里的循环链表

    定义几个结构体,每个结构体里面包含俩个成员,一个整型变量,一个指针变量。让一个结构体里的指针变量指向另一个结构体...

网友评论

      本文标题:iOS 内存对齐:结构体继承和结构体作为另一个结构体成员变量情况

      本文链接:https://www.haomeiwen.com/subject/msgbtltx.html