MST

星途 面试题库

面试题:C++中struct和union嵌套使用的内存布局问题

在C++中,定义一个struct,其中嵌套一个union,struct包含一个int类型成员a,union包含一个char类型成员b和一个short类型成员c。请分析这个嵌套结构在不同编译器下可能的内存布局,并说明原因,同时给出计算该struct大小的代码示例。
33.0万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试

内存布局分析

  1. 不同编译器下的差异
    • 在C++中,structunion的内存布局会受到编译器的对齐规则影响。对齐规则旨在提高内存访问效率,不同编译器的对齐规则可能略有不同,但通常遵循一些基本原则。
    • 对于union,其大小是其最大成员的大小,以满足所有成员都能在该空间中存储。在本题中,char通常占1字节,short通常占2字节,所以union的大小为2字节(假设short大小为2字节)。
    • 对于struct,其大小不仅取决于成员的大小,还取决于对齐规则。一般来说,struct的大小是其最大对齐成员大小的倍数。这里int(假设int大小为4字节)是struct中最大对齐成员。
    • 例如,在某些编译器下,struct的成员会按照其自身的对齐要求进行对齐。int类型的对齐要求可能是4字节(不同系统可能不同),union的对齐要求是其最大成员short的对齐要求,假设short对齐要求为2字节。struct的布局可能是这样:先放置int类型成员a,占用4字节,然后放置unionunion本身大小为2字节,但为了满足int的4字节对齐要求,union后可能会填充2字节,所以整个struct大小为8字节。
    • 然而,有些编译器可能有更严格或不同的对齐策略,可能会将union的对齐也设置为4字节(与int相同),这样union大小为4字节(因为要满足4字节对齐,即使union实际最大成员为2字节),整个struct大小也是8字节。但也有一些编译器可能会采用更紧凑的布局方式,在满足所有成员对齐要求的前提下尽量减少空间浪费。

计算该struct大小的代码示例

#include <iostream>

struct MyStruct {
    int a;
    union {
        char b;
        short c;
    };
};

int main() {
    std::cout << "Size of MyStruct: " << sizeof(MyStruct) << " bytes" << std::endl;
    return 0;
}

在上述代码中,通过sizeof(MyStruct)计算并输出MyStruct结构体的大小。实际运行结果会因编译器和系统的对齐规则不同而有所差异。