面试题答案
一键面试内存布局分析
- 结构体B的内存布局:
- 结构体B包含两个
short
类型成员。short
类型通常在32位和64位系统上都是2字节。由于结构体B没有更复杂的嵌套,其内存占用为2 + 2 = 4字节,因为short
类型本身占用2字节,且没有跨越自然对齐边界的情况。
- 结构体B包含两个
- 结构体A的内存布局:
- 结构体A包含一个
char
类型成员(1字节),一个int
类型成员(通常在32位和64位系统上是4字节),以及一个结构体B(4字节)。 - 内存对齐原则规定,结构体的成员变量要按照其自身大小的整数倍进行对齐。
char
类型成员占用1字节,但为了满足后续int
类型成员的4字节对齐,它后面会填充3字节,使得char
及其填充字节共占4字节。 int
类型成员自然对齐在4字节边界,占用4字节。- 结构体B本身占用4字节,且它也自然对齐在4字节边界(因为它的大小是4字节)。
- 所以结构体A总的内存占用为4(
char
及填充) + 4(int
) + 4(结构体B) = 12字节。
- 结构体A包含一个
内存对齐原则影响分析
内存对齐原则是为了提高CPU访问内存的效率。CPU在访问内存时,通常以特定大小(如4字节、8字节等)的块进行读取。如果结构体成员按照其自身大小的整数倍对齐,CPU可以一次读取一个完整的成员,而不需要进行额外的操作来处理跨越多个内存块的成员。例如,如果int
类型成员没有对齐到4字节边界,CPU可能需要进行两次读取,并对结果进行合并,这会降低访问效率。
代码验证
#include <stdio.h>
#include <stdint.h>
// 定义结构体B
typedef struct {
short s1;
short s2;
} B;
// 定义结构体A
typedef struct {
char c;
int i;
B b;
} A;
int main() {
printf("Size of struct B: %zu bytes\n", sizeof(B));
printf("Size of struct A: %zu bytes\n", sizeof(A));
return 0;
}
在上述代码中,sizeof(B)
输出为4,sizeof(A)
输出为12,验证了我们之前的分析。在不同的编译器和系统环境下,结果可能会因为内存对齐的具体实现而略有不同,但基本的对齐原则是一致的。