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环境

相关推荐
程序猿阿森3 分钟前
Python 闭包与装饰器:从入门到精通
开发语言·python·面试
余额瞒着我当琳16 分钟前
C++--vector底层,leetcode118杨辉三角实战,对于传统reserve的坑点,迭代器失效
开发语言·c++
曹牧20 分钟前
C#:字符串做20位截断
开发语言·c#
醉城夜风~38 分钟前
(超详细)C++多态(Polymorphism)
开发语言·c++
这是个栗子41 分钟前
【JS代码分析】前端鉴权基础:Token 的本地存储与状态重置实践
开发语言·前端·javascript
wuyk5551 小时前
7.AVL 树:第一个自平衡二叉搜索树
开发语言·stm32·单片机·算法
小小龙学IT1 小时前
现代 C++ 内存管理与资源安全深度解析:从 RAII 到所有权模型
c++·安全
SomeB1oody1 小时前
【RustyML入门】5.3. 聚类指标
开发语言·后端·机器学习·rust·教程
欧特克_Glodon1 小时前
OpenCV计算机视觉开发入门与实践<十三>:图像转换之灰度图、二值图
c++·人工智能·opencv·计算机视觉
OPEN-F1 小时前
Python进阶教程:Web开发入门(Flask)
开发语言·python