面试题答案
一键面试- 结构体大小计算过程
- 首先,在默认内存对齐方式下,不同编译器有不同的对齐规则,但常见的是按照结构体中最大基本数据类型的大小进行对齐。
- 对于结构体
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字节。
- C++基本数据类型的位数对内存对齐规则及结构体实际大小的影响
- 内存对齐规则:
- 不同基本数据类型的位数不同,内存对齐以结构体中最大基本数据类型的大小为对齐单位。例如,如果结构体中有
char
(1字节)、short
(2字节)和double
(8字节),则对齐单位是8字节。这是为了提高内存访问效率,因为现代计算机硬件在读取数据时,通常以特定大小(如4字节、8字节等)为单位进行读取,如果数据存储在对齐的地址上,可以减少访问内存的次数。
- 不同基本数据类型的位数不同,内存对齐以结构体中最大基本数据类型的大小为对齐单位。例如,如果结构体中有
- 对结构体实际大小的影响:
- 由于对齐规则,结构体中的成员变量可能不会紧密排列,而是在某些成员变量后需要填充一些字节以满足对齐要求。如上述例子中
char
后填充3字节,short
后填充2字节,导致结构体实际大小大于所有成员变量大小之和。如果基本数据类型位数发生变化(比如在不同平台下int
可能占2字节、4字节等),那么对齐单位和填充字节数都会改变,从而影响结构体的实际大小。
- 由于对齐规则,结构体中的成员变量可能不会紧密排列,而是在某些成员变量后需要填充一些字节以满足对齐要求。如上述例子中
- 内存对齐规则: