面试题答案
一键面试- 内存对齐对变量声明及内存占用的影响:
- 在C和C++中,结构体的内存布局会受到内存对齐规则的影响。内存对齐是为了提高CPU对内存的访问效率。
- 结构体
B
中,float
类型通常占4字节,double
类型占8字节。由于对齐规则,结构体B
的大小通常不是4 + 8 = 12
字节,而是16字节(假设double
类型的对齐要求为8字节,float
类型的对齐要求为4字节,结构体B
的对齐要求是其最大成员的对齐要求,即8字节,所以12
字节要补齐到16字节)。 - 结构体
A
中,int
类型通常占4字节,结构体B
类型成员b
占16字节。结构体A
的对齐要求同样是其最大成员的对齐要求,即8字节(因为B
的对齐要求是8字节)。所以结构体A
的大小不是4 + 16 = 20
字节,而是24字节(20
字节要补齐到24字节,以满足8字节对齐)。
- 手动控制内存对齐以优化内存使用:
- 在GCC编译器中,可以使用
__attribute__((packed))
来取消结构体的内存对齐,以达到最小内存占用。在Microsoft Visual C++中,可以使用#pragma pack(n)
来指定对齐字节数n
(n
通常是1、2、4、8等2的幂次方)。
- 在GCC编译器中,可以使用
- 代码示例:
- GCC编译器:
#include <stdio.h>
// 结构体B
struct __attribute__((packed)) B {
float c;
double d;
};
// 结构体A
struct __attribute__((packed)) A {
int a;
struct B b;
};
int main() {
printf("Size of struct B: %zu bytes\n", sizeof(struct B));
printf("Size of struct A: %zu bytes\n", sizeof(struct A));
return 0;
}
- Microsoft Visual C++:
#include <iostream>
// 结构体B
#pragma pack(push, 1)
struct B {
float c;
double d;
};
#pragma pack(pop)
// 结构体A
#pragma pack(push, 1)
struct A {
int a;
struct B b;
};
#pragma pack(pop)
int main() {
std::cout << "Size of struct B: " << sizeof(struct B) << " bytes" << std::endl;
std::cout << "Size of struct A: " << sizeof(struct A) << " bytes" << std::endl;
return 0;
}
通过手动控制内存对齐,结构体B
的大小变为4 + 8 = 12
字节,结构体A
的大小变为4 + 12 = 16
字节,从而优化了内存使用。但需要注意,取消内存对齐可能会降低CPU对内存的访问效率,在实际应用中需要权衡。