结构体------对齐与压缩(#pragma, __packed)
结构体对齐
摘自原则:
- 结构体中元素是按照定义顺序一个一个放到内存中去的,但并不是紧密排列的。从结构体存储的首地址开始,每一个元素放置到内存中时,它都会认为内存是以它自己的大小来划分的,因此元素放置的位置一定会在自己宽度的整数倍上开始(以结构体变量首地址为0计算)。
- 在经过第一原则分析后,检查计算出的存储单元是否为所有元素中最宽的元素的长度的整数倍,是,则结束;若不是,则补齐为它的整数倍。
我这边补在赘述结构体的对齐原则,上面一篇文章详细讲了,可供大家参考。
新建一个结构体
typedef struct test_struct
{uint8_t A;uint16_t B;uint32_t C;
}test_t;test_t test;
uint16_t size = 0;//查看大小
uint8_t *A_addr;
uint16_t *B_addr;
uint32_t *C_addr;
woid main()
{test.A = 1;test.B = 2;test.C = 3;size = sizeof(test);A_addr = &test.A;B_addr = &test.B;C_addr = &test.C;while(1){}
}
首先是结构体的大小为:8
各个元素的地址
在内存中是这样的:
XX表示未被初始化的内存,虽然也是00,但是我们为了区分所以用XX表示
压缩结构体的方法
__packed
定义
__packed在 "cmsis_armcc.h"文件中定义:
#ifndef __PACKED#define __PACKED __attribute__((packed))
作用
packed属性的主要目的是让编译器更紧凑地使用内存。当它用于变量时,告诉编译器该变量应该有尽可能小的对齐,也就是1字节对齐。当它用于结构体时 ,相当于给该结构体的每个成员加上了packed属性,这时该结构体将占用尽可能少的内存。
typedef __packed struct test_struct
{uint8_t A;uint16_t B;uint32_t C;
}test_t;
使用__packed之后结果:
从上图中可以发现结构体成员地址向前移动了一个,其内存模型如下:
#pragma
语法
#pragma pack (n) 作用:C编译器将按照n个字节对齐。
#pragma pack () 作用:取消自定义字节对齐方式。
#pragma pack (push,1) 作用:是指把原来对齐方式设置压栈,并设新的对齐方式设置为一个字节对齐
#pragma pack(pop) 作用:恢复对齐状态
结果
结果与__packed一致都是按字节对齐的。
#pragma pack(1)
typedef struct test_struct
{uint8_t A;uint16_t B;uint32_t C;
}test_t;
#pragma pack ()
结构体------对齐与压缩(#pragma, __packed)相关推荐
- 结构体对齐,#pragma pack
一.结构体对齐 首先通过一个例子说明结构体对齐,可以看到,下面这个结构体占32字节(32位) typedef struct {double d;short s;int i;char c;short s ...
- C语言结构体对齐[转]
C语言结构体对齐也是老生常谈的话题了.基本上是面试题的必考题.内容虽然很基础,但一不小心就会弄错.写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的 ...
- 这个结构体对齐输出有意思
这个题目是我在群里看到大家讨论的,既然是讨论的了,那我就拿出来说说,因为笔试面试的时候,可能就会遇到这样的题目. 实例代码 #include "stdio.h" #include ...
- linux windows 结构体,Linux下C语言——结构体对齐
结构体对齐的步骤: 1.结构体各成员对齐 2.整个结构体圆整 结构体对齐的特定对齐值: 1.自身对齐值: 自身对齐值就是结构体变量里每个成员的自身大小; 2.指定对齐值: 指定对齐值是由宏#pragm ...
- 结构体对齐(字节对齐)规则及大小计算
什么是字节对齐 这跟读取数据有关,cpu读取一次能读取到的内存大小跟数据总线的位数有关,如果数据总线为16位,那么cpu一次能够读取2字节:如果为32位那么cpu一次可以读取4字节,而读取数据是需要消 ...
- Keil中取消结构体对齐的方法
Keil中取消结构体对齐的方法 我在写通讯协议的时候喜欢使用 Union 的形式将整个数据包按需处理,接收数据时使用数组形式来接收,解析数据则使用结构体形式来解析,伪代码如下. union {uint ...
- C语言结构体对齐详解
文章目录 一.C语言结构体对齐大小快速判断 二.反汇编角度看结构体 三.总结 一.C语言结构体对齐大小快速判断 在C语言中定义一个结构体,里面具体占用多少个字节呢,先举一个例子,如下: #includ ...
- 结构体(对齐规则及举例)
结构体(对齐规则及举例) 文章目录 结构体(对齐规则及举例) 概念 结构体声明 结构体对齐规则 对齐原因 对齐规则 举例说明对齐原则 C++中的结构体struct------类 class和struc ...
- C语言之结构体以及结构体对齐访问
1:简单理解,结构体就是数组的进一步发展,数据的优点和缺陷在于数据里面是元素类型必须相同,但是结构体没有这个要求,结构体里面元素的类型可以相同也可以不同. 2:结构体的定义: struct stude ...
最新文章
- Lesson 59-60 Househusband
- Ubuntu 16.04+GTX970 黑屏无法安装解决方法
- iOS架构-Xcode创建Workspace管理多个子工程(23)
- 词性标注,实体识别,ICTCLAS分析系统的学习
- 贷款能否成功,这4个人说了算
- 获取一个 Byte 的各个 Bit 值
- 7-189 帅到没朋友 (20 分)
- 饿了么element UIel-dialog弹出层/el-dialog修改默认样式不能在style scoped修改
- Python+django网页设计入门(8):网站项目文件夹布局
- 常见SQL Server 2000漏洞及其相关利用2
- python传递类的实例_使用Python将变量从一个类实例传递到另一个类实例?
- python办公室妙用-python eval()函数的妙用和滥用
- cleanlab(解决图像标记错误)
- 机器学习基础 -- 李宏毅2020机器学习课程笔记(一)
- Android内存泄漏分析实战
- 割裂的前端工程师--- 2017年前端生态窥探
- Redhat 7 安装 Nginx
- qt c语言混合编程 pdf,QT中的C++技术 pdf
- Mono.Cecil 修改目标.NET的IL代码保存时报异常的处理。
- 【操作系统】-- 基本分页存储管理(基本地址变换机构、具有快表的地址变换机构)