本文共 1172 字,大约阅读时间需要 3 分钟。
在C语言的结构体中,字节对齐是指将结构体的各个成员占用内存的位置对齐到字节的整数倍。这种对齐方式确保了内存的有效利用,避免了内存碎片的产生。
以两个例子来说明:
st1
包含 char name;
和 double age;
。在32位系统下,st1
占用16个字节(每个成员占用4个字节);而在64位系统下,st1
占用24个字节(每个成员占用4个字节)。st2
包含三个 char
成员,不管是32位还是64位系统,st2
都只占用3个字节。从上述例子可以看出,结构体成员的字节对齐规则如下:
注意:并非所有系统都严格按照字节单位对齐。32位系统对齐4字节,64位系统对齐8字节。
CPU一次可以读取的内存数据量由数据总线宽度决定。例如:
如果不进行字节对齐,CPU在访问结构体中的不同成员时,可能会跨页读取,导致效率降低。例如:
struct st3 { char a; int b;};
在32位系统下,a
占用1字节,b
占用4字节。若不对齐,b
的内存分布为 0x00000002-0x00000004
和 0x00000005
,导致CPU需要两次读取。字节对齐后,b
占用连续的4个字节,CPU一次性读取,效率提升。
在以下情况下需要手动设置字节对齐:
手动设置对齐方式有两种:
#pragma pack(n) // n为对齐字节数struct st3 { char a; int b;};#pragma pack() // 取消对齐
struct bbb { char a; int b;} __attribute__((packed)); // 强制不带填充位
使用 memcpy
比较结构体时,需注意:
示例代码:
#includememcpy(char *dest, const char *src, int len);
字节对齐是保证结构体内存布局一致性的重要技术,尤其在多平台通信和驱动开发中至关重要。通过预编译标识或结构体属性手动设置对齐,可以实现跨平台兼容。
转载地址:http://pccwz.baihongyu.com/