面试题答案
一键面试内存对齐基本原则
- 数据成员对齐规则:结构(struct)或联合(union)的数据成员,第一个数据成员放在偏移量为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int为4字节,则要从4的整数倍地址开始存储)。
- 结构体整体对齐规则:结构体作为成员时,如果一个结构体里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储(例如:struct a里存有struct b,b里有char,int,double等元素,那b应该从8的整数倍开始存储)。结构体的总大小,也就是sizeof的结果,必须是其内部最大成员大小的整数倍,不足的要补齐。
示例说明
#include <iostream>
struct S1 {
char a; // 1字节,从偏移量0开始
int b; // 4字节,从偏移量4(4是int大小的整数倍)开始
short c; // 2字节,从偏移量8(8是short大小的整数倍)开始
};
struct S2 {
short a; // 2字节,从偏移量0开始
S1 b; // S1中最大成员为int(4字节),所以从偏移量4(4是4的整数倍)开始
char c; // 1字节,从偏移量12(12是1的整数倍)开始
};
int main() {
std::cout << "Size of S1: " << sizeof(S1) << std::endl; // 输出12,因为12是4(S1中最大成员int的大小)的整数倍
std::cout << "Size of S2: " << sizeof(S2) << std::endl; // 输出20,因为20是4(S2中最大成员S1中最大成员int的大小)的整数倍
return 0;
}
在上述代码中,S1
结构体中,a
占1字节从0开始,b
占4字节从4开始,c
占2字节从8开始,总大小为12字节(满足是最大成员int
的4字节的整数倍)。S2
结构体中,a
占2字节从0开始,b
是S1
类型,从4开始,c
占1字节从12开始,总大小为20字节(满足是S1
中最大成员int
的4字节的整数倍) 。