在 C 语言和 C++ 中,__attribute__((packed)) 是一种用于数据结构体的编译器扩展属性,这个属性主要用于修改结构体的内存对齐行为。

背景知识:结构体内存对齐

在许多计算机架构中,编译器会自动对数据进行对齐(alignment),也就是说,数据在内存中的地址会遵循一定的对齐规则。这是为了提升数据访问的效率,因为许多处理器在访问对齐的内存地址时速度更快。通常,结构体的每个成员会根据其数据类型按照某种对齐规则进行对齐,同时整个结构体也会有自然对齐值,以适应其最大成员类型的对齐要求。

对齐带来的问题 & 解决:

默认情况下,结构体中的每个成员会在内存中按照其对齐要求进行排列,这可能会导致在两个成员之间出现空闲的字节(称为填充字节),从而浪费一些内存空间。这种内存的浪费在嵌入式系统或者对内存占用敏感的应用场景中可能会被认为不可接受。

使用 __attribute__((packed)) 的意义

  • __attribute__((packed)) 是 GCC 编译器的一个扩展功能,用于要求编译器对指定的数据结构取消默认的对齐填充。
  • 有了 packed 属性,编译器会尽量紧密排列结构体的成员,将数据结构的大小减小到可能的最小值,即所有的字段按照声明的顺序紧密排列,而不插入任何额外的填充字节。
应用情境:
  • 节省内存:在一些内存受限的环境中,例如某些嵌入式系统。
  • 数据协议格式固定:结构体用于与特定格式的存储或通信协议(例如文件格式或网络数据包)进行交互,确保数据对齐和结构体内存布局一致性。

__attribute__((packed)) 或 #pragma pack 会禁用对齐,紧凑排列结构体的成员。

以下是代码示例:

#include <stdio.h>#pragma pack(push, 1)  // 设置为1字节对齐
struct packed_struct {char a;       // 1字节int b;        // 4字节short c;      // 2字节
};
#pragma pack(pop)  // 恢复默认对齐struct normal_struct {char a;       // 1字节int b;        // 4字节short c;      // 2字节
};int main() {printf("Size of normal_struct: %zu bytes\n", sizeof(struct normal_struct));printf("Size of packed_struct: %zu bytes\n", sizeof(struct packed_struct));return 0;
}

代码解析

  1. normal_struct

    • 系统会自动对齐结构体成员,默认对齐方式通常基于成员最大类型的大小(如int为4字节、short为2字节)。
    • char a占用1字节,但后面会填充3字节(以满足int的对齐要求)。
    • int b 正常对齐,占用4字节。
    • short c 后面可能还会补齐额外字节(如果需要),使结构体总大小为int的倍数。
  2. packed_struct

    • 禁用了默认对齐规则,结构体的成员按紧凑方式存放。
    • 泄露的空间被完全消除,每个成员紧跟前一个成员存储。

运行结果(可能因平台不同而异)

假设在一个系统中:

  • int是4字节,short是2字节,char是1字节。
    运行结果可能如下:
Size of normal_struct: 12 bytes
Size of packed_struct: 7 bytes

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/919486.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/919486.shtml
英文地址,请注明出处:http://en.pswp.cn/news/919486.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot3后端项目介绍:mybig-event

mybig-event 项目简介 mybig-event 是一个基于 Spring Boot 的事件管理系统&#xff0c;提供用户管理、文章发布、分类管理、文件上传等功能&#xff0c;采用现代化的 Java 技术栈构建&#xff0c;支持高效开发和部署。 仓库链接&#xff1a;https://github.com/foorgange/mybi…

week3-[分支嵌套]方阵

week3-[分支嵌套]方阵 题目描述 有 nmn\times mnm 个人站成 nnn 行 mmm 列的方阵。我们想知道第 xxx 行 yyy 列的人的某个方向有没有人。 输入格式 输入共 222 行。 第 111 行输入 444 个正整数 n,m,x,yn,m,x,yn,m,x,y。 第 222 行输入 111 个字符为 U、D、L、R 其中之一&#…

深入理解C++ std::shared_ptr:现代C++内存管理的艺术与实践

在C++的发展历程中,内存管理始终是开发者面临的核心挑战。从C语言继承而来的手动内存管理方式,虽然提供了极大的灵活性,却也成为无数程序错误的根源。内存泄漏、悬空指针、双重释放等问题长期困扰着C++开发者,直到智能指针的出现改变了这一局面。作为C++11标准引入的重要特…

一个 WPF 文档和工具窗口布局容器

一个 WPF 文档和工具窗口布局容器、用于排列文档 和工具窗口的方式与许多知名 IDE 类似&#xff0c;例如 Eclipse、Visual Studio、 PhotoShop 等等 AvalonDock 是一个 WPF 文档和工具窗口布局容器&#xff0c;用于排列文档 和工具窗口的方式与许多知名 IDE 类似&#xff0c;例…

【qml-5】qml与c++交互(类型单例)

背景&#xff1a; 【qml-1】qml与c交互第一次尝试&#xff08;实例注入&#xff09; 【qml-2】尝试一个有模式的qml弹窗 【qml-3】qml与c交互第二次尝试&#xff08;类型注册&#xff09; 【qml-4】qml与c交互&#xff08;类型多例&#xff09; 【qml-5】qml与c交互&#…

循环神经网络(RNN)、LSTM 与 GRU (一)

循环神经网络&#xff08;RNN&#xff09;、LSTM 与 GRU &#xff08;一&#xff09; 文章目录循环神经网络&#xff08;RNN&#xff09;、LSTM 与 GRU &#xff08;一&#xff09;循环神经网络&#xff08;RNN&#xff09;、LSTM 与 GRU一、RNN&#xff08;Recurrent Neural N…

【AAOS】Android Automotive 16模拟器源码下载及编译

源码下载repo init -u https://android.googlesource.com/platform/manifest -b android-16.0.0_r2 repo sync -c --no-tags --no-clone-bundle源码编译source build/envsetup.sh lunch sdk_car_x86_64-bp2a-eng make -j8运行效果emualtorHomeAll appsSettingsHAVCNotification…

jvm三色标记

好的&#xff0c;咱们把专业概念和生活例子结合起来&#xff0c;一步一步说清楚三色标记法&#xff1a;一、核心概念&#xff1a;用“颜色”给对象贴“状态标签”就像给家里的物品贴标签&#xff0c;每种颜色代表它在“垃圾回收&#xff08;大扫除&#xff09;”中的状态&#…

生成式AI的能力边界与职业重构:从“百科实习生“到人机协作增强器

根据微软最新研究&#xff0c;基于20万条Copilot使用数据及用户反馈&#xff0c;研究者揭示了生成式AI在实际应用中的能力边界与职业影响。数据显示&#xff0c;用户使用AI助手最频繁的任务是信息获取&#xff08;占比近40%&#xff09;&#xff0c;其次是公众沟通类工作&#…

java17学习笔记

Java17是一个重要的特性发布&#xff0c;也是比较常用的一个版本&#xff0c;根据 2024Java生态统计&#xff0c;Java 17、11 和 8 的用户比例分别为 35%、33% 和 29%。它遵循了自Java10以来引入的Java发布步调&#xff0c;并于2021年 9 月 14 日发布&#xff0c;在Java16发布后…

【AI应用】修改向量数据库Milvus默认密码

说明&#xff1a; 1&#xff09;部署向量数据库milvus运行一段时间后&#xff0c;想开启密码认证登录attu页面 2&#xff09;开启密码认证登录&#xff0c;提示用户和密码不正确&#xff0c;因为默认密码已存储在物理机 3&#xff09;通过attu管理页面修改向量数据库milvus默认…

分布式系统消息队列:可靠投递与延时消息实战

在分布式系统架构中&#xff0c;消息队列&#xff08;MQ&#xff09;作为解耦服务、削峰填谷、异步通信的核心组件&#xff0c;其消息投递的可靠性与延时消息的精准性直接影响业务系统的稳定性。本文结合实际业务场景&#xff0c;详细解析消息投递的全流程设计与延时消息的通用…

Java 学习笔记(基础篇6)

面向对象基础1. 类和对象(1) 示例&#xff1a;public class Student {String name "张三";int age 23;public void study() {System.out.println("学习 Java");}public void eat() {System.out.println("吃饭");} }public class Test {public …

光学件加工厂倚光科技:陪跑光学未来力量

在光学创新的漫漫长路上&#xff0c;总有一些看似 “不划算” 的坚持&#xff0c;却在悄然改写行业的未来。倚光科技的故事&#xff0c;就始于这样一种选择 —— 明知光学打样利润微薄&#xff0c;明知上百个项目中能走到量产的寥寥无几&#xff0c;仍愿意投入全球顶尖的设备与…

RabbitMQ:生产者可靠性(生产者重连、生产者确认)

目录一、生产者重连二、生产者确认一、生产者重连 当网络不稳定的时候&#xff0c;利用重试机制可以有效提高消息发送的成功率。不过SpringAMQP提供的重试机制是阻塞式的重试&#xff0c;也就是说多次重试过程中&#xff0c;当前线程是被阻塞的&#xff0c;会影响业务性能。 …

【深度学习新浪潮】空天地数据融合技术在城市三维重建中的应用

空天地数据融合技术在城市三维重建中的应用已取得显著进展,尤其在提升精度以满足具身智能机器人仿真训练需求方面,研究和产品均呈现多样化发展。以下是关键研究进展、产品方案及精度要求的详细分析: 一、研究进展与技术路径 1. 多源数据融合的技术突破 时空基准统一:通过…

Selenium自动化测试入门:cookie处理

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快driver.get_cookies() # 获得cookie 信息driver.get_cookies(name) # 获得对应name的cookie信息add_cookie(cookie_dict) # 向cookie 添加会话信息delete_cookie(na…

快解析如何让远程访问更安全?

一、勒索病毒攻击服务器的途径很多用户服务器对外开放&#xff0c;实现外网访问&#xff0c;担心服务器被勒索病毒攻击&#xff01;勒索病毒攻击服务器的途径之一是通过路由器开放的端口进行扫描攻击&#xff0c;所以尽量不要在服务器的路由器和防火墙中开放端口二、快解析如何…

Linux下编译ARPACK

本文记录Linux下编译ARPACK的流程。 零、环境 操作系统Ubuntu 22.04.4 LTSVS Code1.92.1Git2.34.1GCC11.4.0CMake3.22.1oneAPI2024.2.1 一、依赖 1.1 安装oneAPI 参见&#xff1a;Get the Intel oneAPI Base Toolkit , Get the Intel oneAPI HPC Toolkit 二、编译ARPACK …

芋道RBAC实现介绍

说明&#xff1a;之前写过一篇博客&#xff0c;介绍如何搭建一个基于角色的权限验证框架 搭建一个基于角色的权限验证框架 本文介绍在非常受欢迎的开源框架——芋道中是如何实现 RBAC 的&#xff0c;芋道的部署参考下面这篇文章&#xff1a; 芋道微服务代码部署 介绍 一般…