c/c++下取消结构体字节对齐方法

转:

作者:码中飞翔 
来源:CSDN 
原文:https://blog.csdn.net/wanxuexiang/article/details/86658855 
版权声明:本文为博主原创文章,转载请附上博文链接!

c/c++下取消结构体字节对齐方法
在c/c++下编译器会默认地对结构体进行对齐,其对齐的方法跟平台具体的特性有关,本文主要介绍结构体不进行对齐的方法。

1、结构体字节不进行对齐的用途
(1)、减小内存占用的空间
结构体默认进行对齐,占用的空间比结构体内部成员变量字节加起来大,如果取消字节对齐,可以减小一部分空间。见下面具体例子。

(2)、直接将结构体作为通信协议(在低带宽下通讯)
在不同的平台下,保证结构体内基本数据的长度相同,同时取消结构体的对齐,就可以将定义的数据格式结构体直接作为数据通信协议使用。

2、结构体字节不对齐的方法
利用伪指令 #pragma pack (n) 可以动态的调整内存对齐的方式:

#pragma pack (n)  // 编译器将按照n个字节对齐;
#pragma pack()   // 恢复先前的pack设置,取消设置的字节对齐方式
#pragma  pack(pop)// 恢复先前的pack设置,取消设置的字节对齐方式
#pragma  pack(1)  // 按1字节进行对齐 即:不行进行对齐
--------------------- 

3、使用示例:

#include <stdio.h>

#pragma pack (1)
typedef struct TestNoAlign
{
    unsigned char u8_test1;
    unsigned int u32_test2;
    double   d8_test3;
    static int sta_test5;   // 静态变量存储在静态区,不在栈中,所以sizeof运算符不会进行计算其占用的空间,此外c语言不只支持结构体内定义static类型的变量,但是c++支持。
}TestNoAlign;

#pragma pack ()

typedef struct TestAlign
{
    unsigned char u8_test1;
    unsigned int u32_test2;
    double   d8_test3;
    static int sta_test4;
}TestAlign;
int main(void)
{
    printf("sizeof(TestNoAlign) is %d sizeof(TestAlign) is %d \n",
                sizeof(TestNoAlign),sizeof(TestAlign)); 
    while(1)
    {
    }
    return 0;
}

root@root:/root# ./test
sizeof(TestNoAlign) is 13 sizeof(TestAlign) is 16 

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值