不同编译器字节对齐方式的修改办法

在C/C++语言中,__packed 是一种编译器相关的关键字,用于告诉编译器将结构体或联合体中的成员按照最小对齐方式进行排列,以减少内存占用。在不同的编译器中,__packed 的具体实现方式和效果可能会有所不同。

  1. __attribute__((packed)) 是 GCC 编译器的特性,在使用时应该写成 __attribute__((packed))。这个特性告诉编译器对该结构体或联合体使用最小对齐方式,确保不会插入任何填充字节。例如:                                                                                         struct __attribute__((packed))                                                                                               MyStruct {   char a;    int b;    char c;     };

  2. __packed 通常是 Microsoft Visual C++ 编译器(MSVC)中的关键字,用于指示编译器按照最小对齐方式打包结构体或联合体。例如:

    #pragma pack(push, 1)  struct __packed MyStruct                                                                                                     { char a; int b;   char c;};                                 
  3. #pragma pack(pop)                                                                                                                   #pragma pack(n) 是一种通用的跨平台方法,可以在需要的地方设置结构体或联合体的对齐方式。其中 n 表示对齐字节数,常见的值包括 1248 等。如果 n 被省略,则表示取消之前设置的对齐方式。例如:
  4. #pragma pack(1)
     struct MyStruct {   char a;  int b ; char c;}                                                                                                                                         
     #pragma pack()
    

总的来说,__attribute__((packed)) 是 GCC 编译器的方式,__packed 是 MSVC 编译器的方式,而 #pragma pack(n) 是一种通用的跨平台设置对齐方式的方法。在使用时,应根据具体的编译器和平台选择合适的方式来实现结构体或联合体的紧凑排列。

__attribute__((packed))__packed#pragma pack(1) 的效果是一样的,它们都用于告诉编译器将结构体或联合体中的成员按照最小对齐方式进行排列,从而减少内存占用并确保数据在内存中的布局紧凑。虽然语法和具体的实现方式有所不同,但在实际使用中,这三种方法都可以达到相同的效果。

无论是使用 __attribute__((packed))__packed 还是 #pragma pack(1),都会使得结构体或联合体中的成员之间没有填充字节,从而实现紧凑的内存布局。因此,你可以根据使用的编译器和个人偏好选择其中一种方式来实现所需的效果。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值