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

结构体的字节对齐方式(__attribute_pack(packed))#pragma pack())

结构体的字节对齐方式(__attribute_pack(packed))&#pragma pack())

1、编译器的字节对齐方式

当前编译器都有默认的字节对齐方式,

struct  PackedStruct {char a;int b;short c;
};

如上代码段中的结构体,在编译运行后发现他的大小并不是7,而是12,这是因为这个编译器默认是四字节对齐。

2、取消字节对齐

__attribute__((packed))

这是 GCC 特定的编译器扩展,用来告诉编译器紧凑地排列结构体的成员,避免使用默认的内存对齐方式。

struct __attribute_pack((packed))  PackedStruct {char a;int b;short c;
};

在增加了__attribute_pack((packed))后,这个结构体的大小变为了7(char:1+int:4+short:2 = 7)

优点:

全局应用__attribute__((packed)) 作用于整个结构体,告诉编译器完全取消对齐填充,将所有成员紧密地排布在一起,按它们声明的顺序紧凑存储。

缺点:

没有灵活的控制:它不允许控制特定字节的对齐边界。也就是说,一旦使用了 packed,整个结构体都变成了不对齐的状态。

3、设置字节对齐的位数

#pragma pack() pragma pack 可以按需指定对齐的字节数,比如 1248 字节对齐。这意味着你可以设置对齐到某个特定的字节边界,而不是完全取消对齐。

例子:

#pragma pack(2)
struct  PackedStruct {char a;int b;short c;
};

那么这个结构体的大小就变成了8 ----->字节对齐为2;

当 #pragma pack() ,括号中没有参数的时候,代表取消程序员自己设定的字节对齐,但它不是和(__attribute_pack((packed)))一样完全取消,而是变为默认字节对齐方式。

http://www.lryc.cn/news/435687.html

相关文章:

  • 若依Ruoyi之智能售货机运营管理系统(新增运营运维工单管理)
  • ModuleNotFoundError: No module named ‘keras.layers.core‘怎么解决
  • C++(三)----内存管理
  • 使用 ShuffleNet 模型在 CIFAR-100 数据集上的图像分类
  • 怎么利用短信接口发送文字短信
  • 【C#生态园】提升C#开发效率:掌握这六款单元测试利器
  • 【QT】自制一个简单的小闹钟,能够实现语音播报功能
  • 基于深度学习的图像描述生成
  • Linux和C语言(Day11)
  • 使用Zlib库进行多文件或者多文件夹的压缩解压缩
  • CSGHub携手Nvidia NIM、阿里计算巢打造企业级私有化部署解决方案
  • opencv的球面投影
  • 5. 去中心化应用(dApp)
  • k8s服务发布Ingress
  • 区块链学习笔记1--比特币
  • 在 Vite 项目中自动为每个 Vue 文件导入 base.less
  • RUST 学习之全局变量
  • 代码随想录八股训练营第三十九天| C++
  • 服务网关工作原理,如何获取用户真实IP?
  • 单链表的实现(C语言)
  • sql语句的训练2024/9/9
  • 【QT】常用控件-下
  • 828华为云征文|华为云Flexus X实例docker部署Jitsi构建属于自己的音视频会议系统
  • 25虾皮笔试shopee笔试测评sea笔试测评题型
  • 启明云端乐鑫代理商,乐鑫ESP32无线芯片方案,物联网设备WiFi联动控制
  • 希尔排序/选择排序
  • 漫谈设计模式 [16]:中介者模式
  • 深度学习-物体检测YOLO(You only look once)
  • redisson中的分布式锁
  • 如何将镜像推送到docker hub