MST

星途 面试题库

面试题:Objective-C 基本数据类型与变量声明:内存对齐与结构体

假设有如下Objective-C结构体定义:`typedef struct { char a; int b; short c; } MyStruct;`,请说明这个结构体在内存中的布局情况,包括每个成员变量的起始地址以及结构体整体占用的内存大小。解释内存对齐原则在这个结构体中是如何应用的,并且说明如何通过调整结构体成员顺序来优化内存使用。
31.4万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试
  1. 内存布局情况
    • 在默认情况下,结构体的内存布局遵循内存对齐原则。假设MyStruct结构体从内存地址0x1000开始。
    • char achar类型占1个字节,它的起始地址为0x1000
    • int bint类型通常在32位和64位系统中占4个字节。由于内存对齐原则,int类型需要4字节对齐,a占1字节,为了满足b的4字节对齐,a后面会填充3个字节,所以b的起始地址为0x1004
    • short cshort类型占2个字节,short类型通常2字节对齐,b占4字节,c的起始地址为0x1008
    • 结构体整体占用的内存大小:a占1字节,填充3字节,b占4字节,c占2字节,总共是1 + 3+4 + 2=10字节,但是结构体的大小需要是其最大对齐成员(这里是int,4字节对齐)的整数倍,所以结构体整体占用12字节。
  2. 内存对齐原则的应用
    • 自然对齐原则:每个数据成员的起始地址必须是该成员自身大小的整数倍。例如int b要求4字节对齐,short c要求2字节对齐。
    • 结构体整体对齐:结构体的大小必须是其最大对齐成员大小的整数倍。在这个例子中,最大对齐成员是int(4字节对齐),所以结构体大小最终为12字节。
  3. 优化内存使用 - 调整结构体成员顺序
    • 可以将成员变量按照大小从大到小排序,即typedef struct { int b; short c; char a; } MyStructOptimized;
    • 此时,int b起始地址为0x1000(占4字节),short c起始地址为0x1004(占2字节),char a起始地址为0x1006(占1字节),结构体整体大小为4 + 2+1 = 7字节,由于要满足4字节对齐(int的对齐要求),所以结构体大小为8字节,相比原来的12字节,优化了内存使用。