C语言-结构体对齐

news/2024/4/24 6:58:31/文章来源:https://blog.csdn.net/ai5945fei/article/details/129199077

详细说明参考博客

(1条消息) C语言结构体对齐,超详细,超易懂_haozigegie的博客-CSDN博客

(1条消息) #pragma pack详解_OuJiang2021的博客-CSDN博客_#pragma pack

以下个人理解总结

出现结构体对齐考虑的根本原因就是:【数据存取执行效率】和【存储空间】的博弈。

1、结构体对齐编译修饰

#pragma pack()    恢复默认对齐方式

#pragma pack(n )   n -1,2,4,8 对齐方式选择 ,n=1表示地址连续分配,无对齐

#pragma pack(show) 显示当前字节对齐方式的字节数,以warning显示。keil-STM32环境pack默认是8.

  • n = 8 表示 1、2、4、8字节的数据都能够一次性快速读写。一般默认是8字节对齐。  
  • n = 4 表示 1、2、4字节数据都能一次性读写。8字节数据可能需要分成两次才能完成一次读写。
  • n = 2 表示 1、2 字节的变量可以一次性读写,4字节变量可能会被分成两次才能读写。8字节可能会更多次。
  • n = 1 为最紧密的存储方式。没有浪费多余的空闲地址。一般在数据打包解析数据流时用到。
#pragma pack(1)
typedef struct
{uint8_t a;uint16_t b;uint32_t c;
}type1;
typedef struct
{uint32_t c;uint16_t b;uint8_t a;
}type2;type1 t1;
int  test()
{t1.a =0xFF;t1.b = 0xFFFF;t1.c = 0xFFFFFFFF;type2 t2;int size = sizeof(t1);int size2 = sizeof(t2);return size ;
}

 此处存放未对齐32位数据用了 

        STR      r2,[r3,#0x03] 

那就是一条就赋值过去了,CotexM3有这个能力额,和开始想的两次写入有点出入。其他平台可就没这么厉害了,比如51单片机就不可以。

2、结构体大小

上文提到结构体对齐是为了快速访问存储器。

虽然在STM32上测试不对奇也有汇编指令STR快速操作存储器。这里有硬件支持不做特殊说明。但是不影响咱们去理解和接受其原理。

 说明:默认状态下,pack = 8

规则1整个结构体的大小等于其成员单个最大变量大小的整数倍数。比如结构体中变量最大2字节,那么最终结构体大小也是2的倍数。如果最大变量时4,则结构体大小就是4的倍数,以此类推。该特性用于占位结构体末尾未对齐的空间

规则2、结构体成员变量每个变量都会找到自己的位置,它自身大小时固定的,唯独它自省和前面变量空留的空间时不定的。主要满足自身大小和地址成整数倍关系就能被快速读写。uint8_类型那所有地址都是整数倍,uin16_t 那就是2的倍数地址。uint32_t  就是4的倍数地址。以此类推。


举例

typedef struct
{uint8_t a;uint16_t b;uint32_t c;
}type1;typedef struct
{uint32_t a;uint16_t b;uint8_t  c;
}type2; 

根据规则1,type1和type2中最大的变量时4字节,所以type1,type2大小就是4的倍数,并且分配时4字节对齐。

type1.a起始地址就是4字节对齐的。 假设为type1.a地址为0x00。正常下一个地址是0x01.但是type1.b是2字节宽的数据。所以不能放在0x01地址,空一格位置。type1.b地址定位0x02.占用2字节。当前地址为0x04,刚好是4的倍数,可以做为type1.c的首地址。

type2中的a,b,c变量按照规则2都在连续的空间上,但是按照规则1,type2大小必须是4的倍数,所以type2.c之后预留了一个空的位置。

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

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

相关文章

Openwrt中动态IPV6 防火墙的正确设置方法

环境:光猫桥接公网IPV6 问题:动态IPV6地址不知道怎么设置防火墙 解决办法:模糊匹配前缀,特定后缀 背景:将家中光猫桥接后,获得了公网的IPV6地址,可以从外部用IPV6访问家中的设备,但I…

【AI写作】 机器人流程自动化 介绍 - Robotic Process Automation (RPA) Introduction

写一篇文章介绍RPA技术,未来的发展。使用markdown格式,有3级索引,超过3000字。 某位大师说过的: 任何行业、任何部门都有大量的场景,涉及重复、有规则逻辑的工作,都可以用 RPA 开发一个软件机器人帮助完成。 文章目录 机器人过程自动化(RPA)简介RPA的定义RPA的好处Robo…

【centos7下部署mongodb】

一.安装环境 CentOS7MongoDB4.0.13正式版。 二.下载MongoDB 1.1 官网下载地址:https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.13.tgz 1.2 将压缩包通过xftp上传到服务器/opt目录,然后解压、改名 三. 配置环境变量及配置文件 3.1配置系…

有限差分法求解不可压NS方程

网上关于有限差分法解NS方程的程序实现不尽完备,这里是一些补充注解 现有的优秀资料 理论向 【1】如何从物理意义上理解NS方程? - 知乎 【2】NS方程数值解法:投影法的简单应用 - 知乎 【3】[计算流体力学] NS 方程的速度压力法差分格式_…

pytorch1.2.0+python3.6

一、说明 pytorch1.2.0python3.6CUDA10.0cudnn7.4.1.5 二、步骤 在conda中创建一个新的虚拟环境 查看一下自己的所有环境 激活虚拟环境 conda activate torch1.2.0 关于cuda和cudnn 1、查看自己电脑系统是10.2版本 http://链接:https://pan.baidu.com/s/1v5cN6…

自学前端,你必须要掌握的3种定时任务

当你看到这篇博客的时候,一定会和狗哥结下不解之缘,因为狗哥的博客里不仅仅有代码,还有很多代码之外的东西,如果你可以看到最底部,看到投票环节,我相信你一定感觉到了,狗哥的真诚,狗…

DateTimeParseException

前端请求为字符串的时间格式2023-02-16 19:19:51,服务端用LocalDateTime类型接收时报解析异常java.time.format.DateTimeParseException: Text 2023-02-16 19:19:51 could not be parsed at index 10方法一:JsonFormat(shape Shape.STRING, pattern &q…

Redis 主从复制-服务器搭建【薪火相传/哨兵模式】

Redis 安装参考文章:Centos7 安装并启动 Redis-6.2.6 注意:本篇文章操作,不能在 静态IP地址 下操作,必须是 动态IP地址,否则最后主从服务器配置不成功! 管道符查看所有redis进程:ps -ef|grep re…

Linux->父子进程初识和进程状态

目录 前言: 1. 父子进程创建 2. 进程状态 R(running)状态: S(sleep)状态: D(disk sleep)状态: T(stopped)状态: X(dead)和Z(zombie)状态: 孤儿进程: 前言: 本篇主要讲解关…

同事每天早下班,原来是用了这8个开发工具

引言 工欲善其事必先利其器,说的就是工匠要想更加高效的做事情,就得先将工具变得锋利。那么对于程序员来说同样也是如此,如果要想每天早点下班,就必须借助于一些开发工具来提高自己的工作效率,今天慕枫就给大家总结一…

365智能云打印怎么样?365小票无线订单打印机好用吗?

365智能云打印怎么样?365智能云打印是有赞官方首推的订单小票打印机,荣获2016年有赞最佳硬件服务商。可以实现远程云打印,无需连接电脑,只需通过GPRS流量或者WIFI即可连接,不受地理位置和距离限制。365小票无线订单打印…

关于高并发场景和进程线程协程的一些总结

1、IO复用和线程池哪个好?应用场景? IO复用就是一个线程处理多个客户端连接。如果自己实现的话,就是要不断轮询每个客户端连接,看看有没有事件发生(数据到达),即使可以用非阻塞的read函数&…

Python编写GUI界面,实现小说下载器

嗨害大家好鸭&#xff01;我是小熊猫~思路一、数据来源分析二. 代码实现步骤代码实现一、单章小说下载二、整本小说下载三、多线程采集四、采集排行榜所有小说五、搜索小说功能六、GUI界面<center>**&#x1f447;问题解答 源码获取 技术交流 抱团学习请联系&#x1f…

金仓数据库安装

一、麒麟操作系统安装金仓数据库 操作系统 DISTRIB_IDKylin DISTRIB_RELEASEV10 DISTRIB_CODENAMEjuniper 按照安装文档的步骤安装&#xff0c;记得记住设置的数据库的用户名、密码 二、window安装连接数据库的工具软件 三、jdbc连接数据库 &#xff08;1&#xff09;连接工…

错误记录:py2neo.errors.ProtocolError: Cannot decode response content as JSON

py2neo.errors.ProtocolError: Cannot decode response content as JSON 原因&#xff1a;目前不清楚 解决方法&#xff1a;进入\lib\site-packages\py2neo\database.py中更改graph_name为neo4j 程序正常运行

Linux命令及CPU占用过高的定位分析思路

一、vim命令不要使用vim打开大文件&#xff0c;vim会一次性读取所有内容到内存&#xff0c;容易造成宿主机内存溢出。 打开文件前&#xff0c;可以使用du -h命令查看文件大小。一般&#xff0c;100MB以下为宜。1、普通模式j 向下30j 向下移动30行k 向上h 向左l 向右0 到行首^ 到…

分阶段构建golang运行环境Dockerfile镜像

在开始这项工作之前大家可以先去看一下docker官方给出关于空镜像scratch的说明&#xff0c;采用官方简单的一句话就是&#xff1a;scratch是一个明确的空图像&#xff0c;特别是对于“从头开始”构建图像。分阶段构建镜像就会用到scratch这个空镜像&#xff0c;这样的好处是可以…

Vulnhub靶场----7、DC-7

文章目录一、环境搭建二、渗透流程三、思路总结一、环境搭建 DC-7下载地址&#xff1a;https://download.vulnhub.com/dc/DC-7.zip kali&#xff1a;192.168.144.148 DC-7&#xff1a;192.168.144.155 二、渗透流程 nmap -T5 -A -p- -sV -sT 192.168.144.155思路&#xff1a; …

【Rust 日报】2023-2-23 Ambient 0.1 发布

治理改革 RFC公告官方博客发布了治理改革RFC的公告&#xff0c;了解详情请点开链接查看。主要看点其实是新的RFC改革治理之后&#xff0c;提供了多语言的支持&#xff0c;其中包括简体中文&#xff0c;该PR目前还在讨论中。原文: https://blog.rust-lang.org/inside-rust/2023/…

RabbitMQ 实现延迟队列

业务场景&#xff1a;1.生成订单30分钟未支付&#xff0c;则自动取消&#xff0c;我们该怎么实现呢&#xff1f;2.生成订单60秒后,给用户发短信1 安装rabbitMqwindows安装ubuntu中安装2 添加maven依赖<!-- https://mvnrepository.com/artifact/org.springframework.boot/spr…