当前位置: 首页 > news >正文

LINUX、WIN32、MACOSX多个平台上GCC、MSVC之间结构体按序列大小1字节对齐

对于GNU编译器,在某些版本编译器及LINUX发行版上,为结构体对齐1字节,应采用以下方式。


        typedef struct __attribute__((packed))
        {
            uint16_t receive_id;
        } vmux_linlayer_add_ack_packet;

即,采用 GNU编译器的间距跨平台编译的,应首选采用GNU/GCC编译器特性,__attribute__((packed)) 来声明该结构体为1字节序列对齐。

对于兼容性其它编译器,应按照C++,语言标准使用编译器指令 #pragma pack(push, 1) 来进行1字节序列对齐。

考虑多编译器多平台编译的 C++ 语言兼容性,其结构体的声明,必须为以下形式:

#pragma pack(push, 1)
        typedef struct 
#if defined(__GNUC__) || defined(__clang__)
            __attribute__((packed)) 
#endif
        {
            uint16_t receive_id;
        } vmux_linlayer_add_ack_packet;
#pragma pack(pop)

GNU编译器虽然支持 #pragma pack(push, 1) 来进行对齐,但在一些特殊的LINUX平台及特定的GNU编译器版本上支持是有问题的,即:我们预期对齐是19字节,但它仍旧是23个字节,但通过GNU编译器单独的 __attribute__((packed)) 特性,可以解决该问题。

如果,你只是在AMD64、I383、I686平台上面,搞搞是不会遇到这种问题的,但如果你搞一些大多数人未曾听闻的CPU指令集平台的程序,那就不一定遇不到这个问题了,所以,如果计划C++一份代码可以移植到多个平台编译器运行,那么你应当按照本文的信息,对C++结构体1字节序列对齐代码实现进行调整。

相关文章:

  • 《Elasticsearch实战:从零开始构建高效全文搜索引擎》
  • Webpack打包过程中如何处理ES6模块的循环依赖?
  • 基于SpringBoot的“古城景区管理系统”的设计与实现(源码+数据库+文档+PPT)
  • 力扣(leetcode)每日一题 1656 设计有序流
  • 2025 年 Java 面试高频手写代码题(附核心实现)
  • 本地部署deepseek大模型后使用c# winform调用(可离线)
  • 某查”平台请求头反爬技术解析与应对
  • css selector
  • docker部署go简单web项目(无mysql等附加功能)
  • Ubuntu从零创建Hadoop集群
  • FS800DTU联动OneNET平台数据可视化View
  • c#编程:SortedList与Dictionary的比较 与 选择
  • Vue3 + Vite + TS,使用 配置项目别名属性:server
  • 如何避免过度依赖某个云服务商
  • 什么是可重入,什么是可重入锁? 它用来解决什么问题?
  • 在vscode中编译运行c语言文件,配置并运行OpenMP多线程并行程序设计
  • ros进阶——强化学习倒立摆的PG算法实现
  • 高斯消元法
  • 如何通过云计算实现业务的持续创新?
  • YOLOv11-ultralytics-8.3.67部分代码阅读笔记-validator.py
  • 绍兴网站建设报价/常州免费网站建站模板
  • 网站权重最高是多少/网站建设开发简介
  • 顺的做网站便宜吗/网站首页制作网站
  • 英文网站建设图片/怎么免费注册域名
  • 百能网是哪家公司做的网站/近期10大新闻事件
  • 自己给自己网站做seo/下百度安装