MST

星途 面试题库

面试题:C++基本数据类型位数与内存对齐关系

已知结构体 `struct { char a; int b; short c; }`,在默认内存对齐方式下,该结构体的大小是多少?请详细说明计算过程,并阐述C++基本数据类型的位数如何影响内存对齐规则以及结构体的实际大小。
45.5万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 结构体大小计算过程
    • 首先,在默认内存对齐方式下,不同编译器有不同的对齐规则,但常见的是按照结构体中最大基本数据类型的大小进行对齐。
    • 对于结构体 struct { char a; int b; short c; }
      • char类型通常占1字节。
      • int类型通常占4字节(在32位和64位系统中常见)。
      • short类型通常占2字节。
      • 这里最大基本数据类型是int,占4字节,所以结构体的对齐单位是4字节。
      • 对于char a,它占1字节,由于要按照4字节对齐,所以它后面会填充3字节,此时从结构体起始位置到a结束共4字节。
      • int b占4字节,直接紧跟其后,此时从结构体起始位置到b结束共8字节。
      • short c占2字节,它后面需要填充2字节以满足4字节对齐,此时从结构体起始位置到c结束共12字节。
    • 所以该结构体的大小是12字节。
  2. C++基本数据类型的位数对内存对齐规则及结构体实际大小的影响
    • 内存对齐规则
      • 不同基本数据类型的位数不同,内存对齐以结构体中最大基本数据类型的大小为对齐单位。例如,如果结构体中有char(1字节)、short(2字节)和double(8字节),则对齐单位是8字节。这是为了提高内存访问效率,因为现代计算机硬件在读取数据时,通常以特定大小(如4字节、8字节等)为单位进行读取,如果数据存储在对齐的地址上,可以减少访问内存的次数。
    • 对结构体实际大小的影响
      • 由于对齐规则,结构体中的成员变量可能不会紧密排列,而是在某些成员变量后需要填充一些字节以满足对齐要求。如上述例子中char后填充3字节,short后填充2字节,导致结构体实际大小大于所有成员变量大小之和。如果基本数据类型位数发生变化(比如在不同平台下int可能占2字节、4字节等),那么对齐单位和填充字节数都会改变,从而影响结构体的实际大小。