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

Logo

中国智能体开发者社区,聚焦智能体与大模型开发,提供前沿资讯、实用工具链、开源项目及行业案例。通过技术沙龙、开发者大赛等活动,促进经验交流与协作,助力开发者快速构建创新智能应用。

更多推荐