C++内存对齐与布局优化
C++内存对齐与布局优化
内存对齐是编译器为了提高内存访问效率而采用的策略。理解内存对齐规则对于优化结构体大小和提高程序性能至关重要。
结构体的内存布局受对齐规则影响,可能包含填充字节。
#include
#include
struct Unaligned {
char a;
int b;
char c;
};
struct Aligned {
int b;
char a;
char c;
};
void alignment_basics() {
std::cout << "Unaligned size: " << sizeof(Unaligned) << "\n";
std::cout << "Aligned size: " << sizeof(Aligned) << "\n";
Unaligned u;
std::cout << "Offset of a: " << offsetof(Unaligned, a) << "\n";
std::cout << "Offset of b: " << offsetof(Unaligned, b) << "\n";
std::cout << "Offset of c: " << offsetof(Unaligned, c) << "\n";
}
alignas关键字可以指定变量或类型的对齐要求。
struct alignas(16) AlignedStruct {
int x;
int y;
};
void alignas_example() {
AlignedStruct s;
std::cout << "AlignedStruct size: " << sizeof(AlignedStruct) << "\n";
std::cout << "AlignedStruct alignment: " << alignof(AlignedStruct) << "\n";
std::cout << "Address: " << &s << "\n";
}
#pragma pack可以控制结构体的对齐方式。
#pragma pack(push, 1)
struct Packed {
char a;
int b;
char c;
};
#pragma pack(pop)
void pragma_pack_example() {
std::cout << "Packed size: " << sizeof(Packed) << "\n";
Packed p;
std::cout << "Offset of a: " << offsetof(Packed, a) << "\n";
std::cout << "Offset of b: " << offsetof(Packed, b) << "\n";
std::cout << "Offset of c: " << offsetof(Packed, c) << "\n";
}
缓存行对齐可以避免伪共享问题。
struct alignas(64) CacheAligned {
int value;
};
struct PaddedCounter {
alignas(64) int counter1;
alignas(64) int counter2;
};
void cache_line_alignment() {
PaddedCounter pc;
std::cout << "Size: " << sizeof(PaddedCounter) << "\n";
std::cout << "Offset of counter1: " << offsetof(PaddedCounter, counter1) << "\n";
std::cout << "Offset of counter2: " << offsetof(PaddedCounter, counter2) << "\n";
}
位域可以节省内存,但可能影响性能。
struct Flags {
unsigned int flag1 : 1;
unsigned int flag2 : 1;
unsigned int flag3 : 1;
unsigned int value : 29;
};
void bitfield_example() {
std::cout << "Flags size: " << sizeof(Flags) << "\n";
Flags f;
f.flag1 = 1;
f.flag2 = 0;
f.flag3 = 1;
f.value = 12345;
std::cout << "flag1: " << f.flag1 << "\n";
std::cout << "value: " << f.value << "\n";
}
联合体的所有成员共享同一块内存。
union Data {
int i;
float f;
char c[4];
};
void union_example() {
std::cout << "Union size: " << sizeof(Data) << "\n";
Data d;
d.i = 0x12345678;
std::cout << "As int: " << std::hex << d.i << "\n";
std::cout << "As bytes: ";
for (int i = 0; i < 4; ++i) {
std::cout << std::hex << (int)(unsigned char)d.c[i] << " ";
}
std::cout << "\n";
}
内存布局优化可以减少结构体大小。
struct Optimized {
double d;
int i1;
int i2;
char c1;
char c2;
short s;
};
void layout_optimization() {
std::cout << "Optimized size: " << sizeof(Optimized) << "\n";
}
理解内存对齐对于编写高效的C++代码至关重要,特别是在性能敏感的应用中。
