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

结构体的字节对齐方式(__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.kler.cn/a/300780.html

相关文章:

  • 利用EXCEL进行XXE攻击
  • 接口测试自动化实战(超详细的)
  • K8S集群常用命令
  • C++:工具VSCode的编译和调试文件内容:
  • Linux 进程前篇(冯诺依曼体系结构和操作系统)
  • Spring Boot 动态表操作服务实现
  • vivo手机已删除的短信还能恢复吗?
  • linux下进程详解
  • 【超简单】1分钟解决ppt全文字体一键设置
  • Linux用户和组群账户管理
  • 一文读懂:如何将广告融入大型语言模型(LLM)输出
  • java-在ANTLR中BaseListner的方法和词法规则的关系0.5.0
  • 【Go】Go语言中的基本数据类型与类型转换
  • 大白话!解析大模型原理!
  • 系统设计文档示例
  • 正版软件 | Sticky Password 终身密码管理器 - 使用教程分享
  • Flask 第四课 -- 基本概念
  • Weakly-Supervised Video Moment Retrieval via Semantic Completion Network 论文阅读
  • 【Django】Django AI 聊天机器人项目:基于 ChatGPT 的 Django REST API
  • 优惠券线下使用情况数据分析
  • k8s防火墙networkPolicy,其他规则和端口规则ports的匹配顺序,进站策略ingress和出站策略egress中,ports规则的常用方法。
  • 【绝对有用】顶尖ChatGPT学术论文指令集
  • 【TabBar嵌套Navigation案例-复习昨天的内容-预习今天的内容 Objective-C语言】
  • JavaEE:多线程进阶(JUC [java.util.concurrent] 的常见类)
  • 论文学习笔记 VMamba: Visual State Space Model
  • Spring Boot 集成 MinIO 与 KKFile 实现文件预览功能