C/C++字节对齐

C/C++字节对齐

C/C++字节对齐

1.G_PACKED

cpp 复制代码
#ifdef __GNUC__
  #define G_PACKED( __Declaration__ ) __Declaration__ __attribute__((packed))
#else
  #define G_PACKED( __Declaration__ ) __pragma( pack(push,1)) __Declaration__ __pragma( pack(pop))
#endif

G_PACKED(
typedef struct __abc
{
    uint8_t  Forced_lock; /*< 数据,赋值操作,*/
    uint32_t  reserve; /*< 数据,赋值操作,预留*/
    uint8_t  hover_now; /*< 数据,赋值操作,*/
}) abc_s;

2.1 pack(push)

cpp 复制代码
#pragma pack(push) //保存对齐状态
#pragma pack(1)//设定为1字节对齐
typedef struct
{
    uint8_t msgType;	//消息类型
    uint16_t exitReason;	//退出原因
} fileTransmitExit_t;
#pragma pack(pop)//恢复对齐状态

2.2 pack(1)

cpp 复制代码
#pragma pack(1) // 按照1个字节对齐
typedef struct
{
    uint8_t msgType;	//消息类型
    uint16_t exitReason;	//退出原因
}fileTransmitExit_t4;
#pragma pack() // 取消自定义对齐方式

全部例子

cpp 复制代码
#pragma once
#include <iostream>

using namespace std;

#ifdef __GNUC__
  #define G_PACKED( __Declaration__ ) __Declaration__ __attribute__((packed))
#else
  #define G_PACKED( __Declaration__ ) __pragma( pack(push,1)) __Declaration__ __pragma( pack(pop))
#endif

G_PACKED(
typedef struct __abc
{
    uint8_t  Forced_lock; /*< 数据,赋值操作,*/
    uint16_t  reserve; /*< 数据,赋值操作,预留*/
    uint8_t  hover_now; /*< 数据,赋值操作,*/
}) test1;

#pragma pack(push) //保存对齐状态
#pragma pack(1)//设定为1字节对齐
typedef struct
{
    uint8_t msgType;	//消息类型
    uint16_t exitReason;	//退出原因
    uint8_t msgType2;
} test2;
#pragma pack(pop)//恢复对齐状态

#pragma pack(1)//设定为1字节对齐
typedef struct
{
    uint8_t msgType;	//消息类型
    uint16_t exitReason;	//退出原因
    uint8_t msgType2;
}test3;
#pragma pack()//恢复对齐状态

typedef struct
{
    uint8_t msgType;	//消息类型
    uint16_t exitReason;	//退出原因
    uint8_t msgType2;
}__attribute__ ((aligned(1))) test4;

typedef struct
{
    uint8_t msgType;	//消息类型
    uint16_t exitReason;	//退出原因
    uint8_t msgType2;
}__attribute__((packed)) test5;

int main()
{
    cout << "Hello World!" << endl;
    printf("test1 size1:%d\n", sizeof (test1));
    printf("test2 size2:%d\n", sizeof (test2));
    printf("test3 size3:%d\n", sizeof (test3));
    printf("test4 size4:%d\n", sizeof (test4));
    printf("test5 size4:%d\n", sizeof (test5));
    return 0;
}

Qt windows 输出结果

ubuntu2004 linux环境

相关推荐
蜀黍@猿10 分钟前
C/C++基础错题归纳
c++
古希腊掌管学习的神18 分钟前
[LeetCode-Python版]相向双指针——611. 有效三角形的个数
开发语言·python·leetcode
赵钰老师18 分钟前
【R语言遥感技术】“R+遥感”的水环境综合评价方法
开发语言·数据分析·r语言
雨中rain25 分钟前
Linux -- 从抢票逻辑理解线程互斥
linux·运维·c++
就爱学编程26 分钟前
重生之我在异世界学编程之C语言小项目:通讯录
c语言·开发语言·数据结构·算法
Oneforlove_twoforjob1 小时前
【Java基础面试题025】什么是Java的Integer缓存池?
java·开发语言·缓存
emoji1111111 小时前
前端对页面数据进行缓存
开发语言·前端·javascript
每天都要学信号1 小时前
Python(第一天)
开发语言·python
TENET信条1 小时前
day53 第十一章:图论part04
开发语言·c#·图论
北国无红豆1 小时前
【CAN总线】STM32的CAN外设
c语言·stm32·嵌入式硬件