美文网首页
IOS面试题 --- 结构体相关

IOS面试题 --- 结构体相关

作者: ShawnAlex | 来源:发表于2021-04-29 17:10 被阅读0次

问题1:

针对下面结构体 , 内存占用多少字节?
struct Struct1{
char a;
int b;
short c;
}struct1;

答案:

12字节

解释:

首先要知道内存对齐原则

  1. 数据成员对齐可以理解为min(m, n)公式, 其中m表示当前成员开始位置, n表示当前成员所需要的位数。如果满足 m 整除 n (m % n == 0), nm位置开始存储, 反之m循环+1, 直至可以整除, 从而确定了当前成员位置。

  2. 结构体的内存大小必须为结构体最大成员内存大小的整数倍, 不足需要补齐

那么有

  • char类型占 1字节, 初始位置0开始放char, 占位(0)
  • int类型占 4字节, 起始位置4开始放int, 占位(4, 5, 6, 7)
  • short类型占 2字节, 起始位置8开始放short, 占位(8, 9)
  • 最大成员int 4字节, 所以补齐到4的整数倍, 结果12

验证:

问题1 验证

问题2:

针对下面嵌套结构体 , 结构体2(struct2)占用多少字节?

      struct Struct1{
          char a;
          int b;
          short c;
      }struct1;

      struct Struct2{
          int a;
          double b;
          char c;
          struct Struct1 struct1;
          short d;
      }struct2;

答案:

40 字节

解释:

建议先做下"问题一"

首先要知道内存对齐原则

  1. 数据成员对齐可以理解为min(m, n)公式, 其中m表示当前成员开始位置, n表示当前成员所需要的位数。如果满足 m 整除 n (m % n == 0), nm位置开始存储, 反之m循环+1, 直至可以整除, 从而确定了当前成员位置。

  2. 结构体的内存大小必须为结构体最大成员内存大小的整数倍, 不足需要补齐

  3. 数组成员为结构体, 当结构体嵌套结构体时, "成员"的结构体的自身长度为"成员"结构体中最大成员的内存大小, 例如结构体a嵌套结构体b,b中有char、int、double等,则b的自身长度为8

那么有

  • int类型占 4字节, 初始位置0开始放int, 占位(0, 1, 2, 3)

  • double类型占 8字节, 起始位置8开始放double, 占位(8, 9, 10, 11, 12, 13, 14, 15)

  • char类型占 1字节, 起始位置8开始放char, 占位(16)

  • struct1内部最大成员为int 类型, 固需要按4字节对齐, struct1整体占12字节
    固起始位置20开始放struct1, 占位(20~31), 其中struct1内: char a占位(20), int b占位(24, 25, 26, 27), short c占位(28, 29), 30~31为结构体struct1内部补齐

  • short类型占 2字节, 起始位置32开始放short c;, 占位(32, 33)

  • 最大成员double 8字节, 所以补齐到8的整数倍, 结果40

验证:

问题2验证

(持续更新....)

相关文章

网友评论

      本文标题:IOS面试题 --- 结构体相关

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