内存对齐是为了提升c++pu访问效率,通过填充字节使结构体成员位于合适地址。1. cpu按块读取数据,若未对齐可能引发多次访问或异常;2. 编译器默认按成员大小对齐,结构体总大小为最大成员对齐值的倍数;3. #pragma pack可改变对齐方式,实现紧凑布局但可能影响性能;4. c++11的alignas提供更标准、细粒度的对齐控制,主要用于增强对齐以满足高性能需求。

当我们谈论结构体成员的内存对齐时,其实就是在说编译器为了性能优化,在内存中如何巧妙地安排数据。它不是简单地把成员一个接一个地堆叠起来,而是会根据类型大小和系统架构,在成员之间插入一些“空隙”,也就是填充字节,确保每个成员都能在CPU最舒服的位置上被访问。这通常意味着结构体的实际大小会比你预期的——也就是所有成员大小简单相加——要大一些。而
#pragma pack
alignas

内存对齐这事儿,说白了,就是为了让CPU能更高效地从内存里取数据。你想想,CPU从内存里读数据,它可不是一个字节一个字节地读,而是按“块”来的,比如4字节、8字节,甚至更大,像缓存行通常是64字节。如果一个数据项,比如一个
int
int
double

所以,这背后到底有什么考量呢?本质上,CPU与内存的交互效率是核心。现代CPU通常采用总线宽度和缓存线(cache line)的概念来存取数据。如果一个变量没有对齐到其“自然”边界,比如一个4字节的整数却从一个奇数地址开始存放,那么CPU可能需要两次内存访问才能把它完整地加载到寄存器中。更糟糕的是,在某些RISC架构的处理器上,这种未对齐访问甚至可能直接导致硬件异常或性能严重下降。
默认情况下,编译器会遵循一个相对简单的规则:每个成员变量的偏移量(offset)必须是其自身大小的倍数(或者说是其自身类型对齐值与结构体当前最大对齐值中的较小者)。同时,整个结构体的总大小必须是其最大成员对齐值的倍数。

我们来看个例子,假设在64位系统上:
struct MyStruct {
char a; // 1 byte
int b; // 4 bytes
char c; // 1 byte
double d; // 8 bytes
};如果没有对齐,你可能会觉得它就是1+4+1+8 = 14字节。但实际情况是:
a
b
a
b
c
d
c
d
double
所以,
sizeof(MyStruct)
有时候,这种默认的对齐行为并不总是我们想要的。比如,你可能在和一些外部的二进制数据格式打交道,这些数据格式可能要求严格的“紧凑”布局,不含任何填充;或者你正在开发嵌入式系统,内存资源极其宝贵,需要尽可能地减少结构体大小。这时候,
#pragma pack
#pragma pack
#pragma pack(push, 1) // 将当前对齐设置压栈,并设置新的对齐字节数为1
struct PackedStruct {
char a; // 1 byte
int b; // 4 bytes
char c; // 1 byte
double d; // 8 bytes
};
#pragma pack(pop) // 恢复之前保存的对齐设置在这里,
#pragma pack(1)
PackedStruct
a
b
c
d
所以,
sizeof(PackedStruct)
你也可以设置其他对齐值,比如
#pragma pack(4)
#pragma pack(push, 4)
struct Aligned4Struct {
char a; // 1 byte
int b; // 4 bytes
char c; // 1 byte
double d; // 8 bytes
};
#pragma pack(pop)在这个例子中:
a
b
a
b
c
d
#pragma pack(4)
double
d
c
#pragma pack
alignas
进入C++11时代,我们有了更标准、更灵活的对齐控制方式——
alignas
#pragma pack
alignas
alignas
alignas(expression)
expression
你可以这样使用它:
struct alignas(16) MyAlignedData { // 整个结构体都要求16字节对齐
int id;
char name[12];
float value;
};
// 也可以对单个变量进行对齐
alignas(32) char largeBuffer[1024];
struct MixedAlignment {
char status;
alignas(8) long long timestamp; // 仅此成员要求8字节对齐
int counter;
};alignas
#pragma pack
#pragma pack
alignas
#pragma pack
alignas
alignas
alignas
alignas
使用
alignas
虽然
alignas
以上就是结构体成员如何内存对齐 详解#pragma pack与alignas用法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号