#pragma pack()详解
#pragma pack()详解,并对其进行举例说明
·
1、基本作用
#pragma pack() 是一种用于控制结构体、联合体和类成员的对齐方式的指令。它让你可以明确指定编译器在内存中如何对齐这些数据类型的大小,以便满足特定的内存对齐要求。
2、为什么需要对齐?
对齐要求和性能密切相关。某些硬件平台要求数据类型按照特定的字节边界对齐,这样可以提高数据访问的效率。如果数据不按适当的边界对齐,可能会导致性能下降,甚至在某些硬件上导致访问错误或异常。
3、用法
#pragma pack()是一个编译器指令,用来控制结构体的对齐方式。它通常有两种用法:
#pragma pack(n):指定结构体对齐的字节数。n是一个整数,表示对齐的边界,通常为 1、2、4、8 等。#pragma pack():恢复编译器的默认对齐方式。
#pragma pack(n) // 按n字节对齐
#pragma pack() // 恢复默认对齐方式
常用例程
下面我会通过一个具体的例子来说明不同的排序是如何填充的,如果小于4字节,编译器会自动插入填充字节来满足字节对齐的要求。但要注意的是实际上的对齐是要将地址对齐。
例如,如果要求4字节对齐,那么实际上是需要将地址要是4的倍数。如0,4,8,12...等等
1、按照4字节对齐:
#include <stdio.h>
#pragma pack(4) //按4字节对齐
struct MyStruct {
char a; // 1 byte
int b; // 4 bytes
char c; // 1 byte
};
#pragma pack() //恢复默认对齐方式
int main() {
struct MyStruct s;
printf("Size of MyStruct: %lu\n", sizeof(s));
return 0;
}
内存排序:
| 地址 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 数据 | a | b | b | b | b | |||
| 8 | ||||||||
| c | - | - | - | - |
结果:
Size of MyStruct: 12
2、按照1字节对齐:
#include <stdio.h>
#pragma pack(1) //按照1字节对齐
struct MyStruct {
char a; // 1 byte
int b; // 4 bytes
char c; // 1 byte
};
#pragma pack() //恢复默认对齐方式
int main() {
struct MyStruct s;
printf("Size of MyStruct: %lu\n", sizeof(s));
return 0;
}
内存排序:
| 地址 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 数据 | a | b | b | b | b | c |
结果:
Size of MyStruct: 6
3、按照2字节对齐:
#include <stdio.h>
#pragma pack(2) //按照2字节对齐
struct MyStruct {
char a; // 1 byte
int b; // 4 bytes
char c; // 1 byte
};
#pragma pack() //恢复默认排序方式
int main() {
struct MyStruct s;
printf("Size of MyStruct: %lu\n", sizeof(s));
return 0;
}
内存排序
| 地址 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 数据 | a | b | b | b | b | c |
结果:
Size of MyStruct:8
更多推荐



所有评论(0)