【ARM 嵌入式 编译系列 11 -- GCC __attribute__((packed))详细介绍】

文章目录

    • __attribute__((packed)) 介绍

上篇文章:ARM 嵌入式 编译系列 10.3 – GNU elfutils 工具小结
下篇文章:ARM 嵌入式 编译系列 11.1 – GCC attribute((aligned(x)))详细介绍

attribute((packed)) 介绍

__attribute__((packed)) 是 GCC 编译器的一个特性,它可以用于阻止编译器为结构体或联合体的成员进行对齐优化,从而使其尽可能地小。

默认情况下,编译器可能会在结构体的成员之间添加填充字节,以确保特定类型的数据在内存中按照适当的边界对齐,以提高处理器访问数据的效率。但是,这可能会导致结构体比实际需要的更大。

使用 __attribute__((packed)) 可以消除这些填充字节,使得结构体或联合体的大小尽可能小。

以下是一个简单的示例:

#include <stdio.h>struct normal_struct 
{ char c; int i; 
}; struct __attribute__((packed)) packed_struct { char c; int i; 
}; int main(void) 
{ printf("Size of normal_struct: %lu\n", sizeof(struct normal_struct)); printf("Size of packed_struct: %lu\n", sizeof(struct packed_struct)); return 0; 
}

在这个示例中,normal_struct 是一个常规的结构体,由于编译器对 int 类型的对齐要求,它的大小可能大于 packed_structpacked_struct 使用了 __attribute__((packed)),所以它的大小是成员 char cint i 的大小的总和,没有额外的填充字节。

[09:34:09]sam@sam-pcStation-P350 (*^~^*) ~/workbase/test> gcc test.c
[09:34:13]sam@sam-pcStation-P350 (*^~^*) ~/workbase/test> ./a.out
Size of normal_struct: 8
Size of packed_struct: 5

但是请注意,使用 __attribute__((packed)) 可能会导致处理器需要执行额外的操作来加载或存储非对齐的字段,这可能会降低代码的性能。因此,在考虑使用此属性时,应权衡内存使用和代码性能之间的平衡。

上篇文章:ARM 嵌入式 编译系列 10.3 – GNU elfutils 工具小结
下篇文章:ARM 嵌入式 编译系列 11.1 – GCC attribute((aligned(x)))详细介绍

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

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

相关文章

针对Android项目蓝牙如何学习

一、概述(Overview) 蓝牙是一种专有的开放式无线技术标准,用于在固定和移动设备之间进行短距离数据交换(使用2400–2480 MHz ISM波段的短波长无线电传输),从而创建具有高度安全性的个人局域网(PANs)。由电信供应商爱立信(telecoms vendor Ericsson)于1994年创建,[1…

系统架构设计师---计算机网络基础知识

根据考试大纲,本章知识点会涉及单项选择题,约占2~6分。本章内容属于基础知识范畴,根据以往全国计算机技术与软件专业技术资格(水平)考试的出题规律而言,会在单项选择题中出现,也会在案例分析题中出现。 想成为一名合格的高级架构师,需要在计算机领域中“上知天文,下知地…

【ES】笔记-ES6的函数rest参数用法

es6中引入了rest参数&#xff0c;样式形如…xxx&#xff0c;用于获取函数的多余参数&#xff0c;这样就不需要使用arguments对象了。rest参数搭配的一个变量是一个数组&#xff0c;该变量将多余的参数放入数组中。例如&#xff1a; function add(...value){console.log(value);…

pytest自动生成测试类 demo

一、 pytest自动生成测试类 demo # -*- coding:utf-8 -*- # Author: 喵酱 # time: 2023 - 08 -15 # File: test4.py # desc: import pytest import unittest# 动态生成测试类def create_test_class(class_name:str, test_cases:list) -> type:"""生成测试类…

前端面试的性能优化部分(10)每天10个小知识点

目录 系列文章目录前端面试的性能优化部分&#xff08;1&#xff09;每天10个小知识点前端面试的性能优化部分&#xff08;2&#xff09;每天10个小知识点前端面试的性能优化部分&#xff08;3&#xff09;每天10个小知识点前端面试的性能优化部分&#xff08;4&#xff09;每天…

TiDB数据库从入门到精通系列之一:TiDB数据库的软硬件环境要求和系统配置检查

TiDB数据库从入门到精通系列之一&#xff1a;TiDB数据库的软硬件环境要求和系统配置检查 一、软件和硬件配置要求1.操作系统及平台要求2.服务器建议配置3.网络要求4.磁盘空间要求 二、TiDB 环境与系统配置检查1.在 TiKV 部署目标机器上添加数据盘 EXT4 文件系统挂载参数2.设置 …

RESTAPI简介与DRF使用

RESTAPI 以资源为url&#xff0c;通过不同的请求方式实现不同的行为。 以资源名作为url POST:增 …/student/ GET&#xff1a;查所有 …/student/ GET&#xff1a;查单个 …/student/<pk>/ 获取idpk的学生 DELETE&#xff1a;删 …/student/<pk>/ PUT&#…

轻量级 Spring Task 任务调度可视化管理

Spring Task/Spring Scheduler 傻傻分不清 首先做一下“名词解释”&#xff0c;分清楚这两者的区别&#xff1a; Spring Task Spring Task 是 Spring 框架自带的一个任务调度模块&#xff0c;提供了基本的任务调度功能。它是通过 Java 的 Timer 和 TimerTask 类来实现的&…

python获取音乐文件

浏览器打开音乐地址 http://www.htqyy.com/top/hot 点击第一首歌曲&#xff0c;会打开新的网页并且可以获取 改歌曲的id&#xff0c;就是url中的33 在播放页面点击F12&#xff0c;打开开发者调试功能 如下图所示&#xff0c;在script脚本中可以获取歌曲的下载数据 host&#…

滑模控制器理论推导和matlab/simulink实例分享

滑模控制的运动轨迹主要分为两个方面&#xff1a;(1)系统的任意初始状态向滑模面运动阶段&#xff1b;(2)系统到达滑模面后并且慢慢趋于稳定的阶段。所以&#xff0c;对于滑模变结构控制器的设计&#xff0c;对应于系统运动的两个阶段&#xff0c;可以分为两个部分&#xff1a;…

从规划到落地,数字化工厂如何破局

随着第四次工业革命的推进&#xff0c;数字化工厂解决方案已经成为制造业转型升级的必经之路。然而&#xff0c;在实际推进过程中&#xff0c;许多企业却面临着规划难以落地、投资回报率低、人才短缺等问题。如何破局&#xff0c;实现数字化工厂的顺利转型&#xff0c;成为制造…

卡尔曼滤波

初见Kalman 假设我养了一只猪&#xff1a; 一周前&#xff0c;这只猪的体重是460.5kg。注意&#xff0c;在这里我用了0.5&#xff0c;表示其实我对这只猪一周前的体重并不是那么确定的&#xff0c;也就是说&#xff0c;46kg这个体重有0.5kg的误差。现在&#xff0c;我又养了这只…

Java基础(十二)面向对象编程 OOP

一、抽象数据类型 1.面向对象基本概念 1. 面向对象 面向对象程序设计&#xff08;OOP&#xff09;是一种基于对象概念的软件开发方法&#xff0c;是目前软件开发的主流方式。 常见面向对象的语言&#xff1a;C 、Python 、Java 常见面向过程的语言&#xff1a;C 面向对象的三…

计算机竞赛 python+opencv+机器学习车牌识别

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于机器学习的车牌识别系统 &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度系数&#xff1a;4分工作量&#xff1a;4分创新点&#xff1a;3分 该项目较为新颖&#xff0c;适…

使用插件实现pdf,word预览功能

效果 代码&#xff1a; 插件地址&#xff1a; https://github.com/501351981/vue-office <a-modalv-model:visible"visible":title"title"ok"handleOk":bodyStyle"bodyStyle":width"1200":maskClosable"false"…

如何在Vue表单处理中实现表单的条件渲染

在Vue开发中&#xff0c;我们经常会遇到需要根据某些条件来渲染表单的情况。这种情况下&#xff0c;我们需要灵活地根据条件来展示或隐藏一些表单字段。本文将介绍如何在Vue中实现表单的条件渲染&#xff0c;并提供了代码示例。 一、使用v-if指令实现简单的条件渲染 在Vue中&a…

2023年网络安全比赛--综合渗透测试(超详细)

一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 1.扫描目标靶机将靶机开放的所有端口,当作flag提交(例:21,22,23); 2.扫描目标靶机将靶机的http服务版本信息当作flag提交(例:apache 2.3.4); 3.靶机网站存在目录遍历漏洞,请将…

Linux设备树详解

Linux 设备树详解 Linux 操作系统早期是针对个人电脑设备而开发的操作系统&#xff0c;而个人电脑处理器产商较为单一&#xff08;例如只有 Intel&#xff0c;AMD&#xff09;同时个人电脑产商均使用 Intel 或 AMD 制造的处理器&#xff0c;业界形成了统一的总线/硬件接口标准…

JavaScript进阶 第二天

深入对象内置构造函数 一. 深入对象 创建对象三种方式构造函数实例成员&静态成员 1.1 创建对象三种方式 ① 利用对象字面量创建对象 const o {name: 哈哈 } ② 利用new Object 创建对象 const o new Object({ name: 哈哈 }) ③ 构造函数创建对象 1.2 构造函数 …

探索规律:Python地图数据可视化艺术

文章目录 一 基础地图使用二 国内疫情可视化图表2.1 实现步骤2.2 完整代码2.3 运行结果 一 基础地图使用 使用 Pyecharts 构建地图可视化也是很简单的。Pyecharts 支持多种地图类型&#xff0c;包括普通地图、热力图、散点地图等。以下是一个构建简单地图的示例&#xff0c;以…