结构体的内存对齐规则
1.结构体的内存对齐规则
1.第一个成员在与结构体变量偏移量为0的地址处。
2.其他成员变量都放在对齐数(成员的大小和默认对齐数的较小值)的整数倍的地址处。
对齐数=编译器默认的一个对齐数与该成员大小的较小值。(VS中默认的对齐数是8)
3.结构体总大小为最大对齐数(每个成员变量都有一个对齐数 )的整数倍。
4.如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
2.例子
1、例一
2、例二
3.为什么存在内存对齐
参考了大部分资料,大部分都这么说:
1.平台原因(移植问题): 不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常。
2.性能原因: 数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。
总的来说:
结构体的内存对齐是拿空间来换取时间的做法
既然这样,那在设计结构体的时候,我们既要满足对齐,又要节省空间,如何做到:让占用空间小的成员尽量集中在一起。 如:
#include<stdio.h>struct S1
{char c1;int i;char c2;
}struct S2//优化后
{char c1;char c2;int i;
}
4.如何修改默认对齐数
我们见过了 #pragma这个预处理指令,这里我们再次使用,可以改变我们的默认对齐数
#include<stdio.h>
#pragma pack(8)//设置默认对齐数为8struct S1
{char c1;char c2;int i;
}
#pragma pack()//取消设置的默认对齐数,还原为默认值#pragma pack(1)//设置默认对齐数为1
struct S2
{char c1;char c2;int i;
}
谢谢观看,不要吝啬你们的三连哦!
结构体的内存对齐规则相关推荐
- c 定义结构体时提示应输入声明_C++|了解结构体的内存对齐(成员声明的顺序影响占用空间大小)...
我们使用的电子计算机绝大部分都是冯·诺依曼结构的机器,遵循"存储程序"的概念.数据处理以存储为前提,在编程中数据如何"存得进去,取得出来",并且符合空间.时间效 ...
- 自定义类型详解:结构体(内存对齐、位段) + 枚举 + 联合
目录 一.结构体 1.特殊的声明 2.结构体自引用 3.结构体变量的定义和初始化 4.打印结构体 二.==结构体内存对齐== 1.内存对齐 结构体嵌套如何求 为什么存在内存对齐? 2.修改默认对齐数 ...
- C语言:指针的偏移步长、结构体成员的偏移量、嵌套结构体成员的偏移量、结构体的内存对齐
文章目录 1 不同类型指针的偏移步长 2 结构体成员的偏移量 3 嵌套结构体成员的偏移量 4 结构体的内存对齐 4.1 内存对齐的原因与优点 4.2 结构体内存对齐的规则 4.3 结构体嵌套结构体时的 ...
- 字节对齐《c和指针》笔记--包含位域结构体的内存对齐(32bit,GCC)
最近使用开发的过程中出现了一个小问题,顺便记录一下原因和方法--字节对齐 C99划定int.unsigned int和bool可以作为位域类型.但编译器几乎都对此作了扩展,答应其它类型类型的存在. ...
- 基于STM32使用嵌套结构体摸索内存对齐
导读 一.结构体的声明以及初始化 二.结构体成员的内存对齐规则 三.联合体以及嵌套结构体的用法 位段 小端模式 三.位段数据跨字节单位导致的内存对齐现象 用来描述对象特征的各类信息,通常会被整合成记录 ...
- 简单理解结构体的内存对齐
学习总结 内存对齐三原则: 数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子 ...
- 3.c语言结构体成员内存对齐详解
一.关键一点 最关键的一点:结构体在内存中是一个矩形,而不是一个不规则形状 二.编程实战 1 #include <stdlib.h> 2 #include <stdio.h> ...
- C语言--结构体与内存对齐准则简单理解
平时基本不涉及这个问题,被问起才发现没那么简单... 一,结构体:内存中所有类型字节之和 #include<stdio.h> struct icd {int a;char b;double ...
- [转]C++结构体|类 内存对齐详解
内存地址对齐,是一种在计算机内存中排列数据(表现为变量的地址).访问数据(表现为CPU读取数据)的一种方式,包含了两种相互独立又相互关联的部分:基本数据对齐和结构体数据对齐 . 为什么需要内存对齐?对 ...
最新文章
- 【opencv】(4) 形态学处理:腐蚀膨胀、梯度运算、礼帽黑帽
- granfana telegraf influx安装与使用
- 3DSlicer13:Command Line Interface(CLI)
- javascript --- event loop
- MySQL 授权远程登录(Ubuntu 环境)
- 【转】ArcGIS Server安装
- 第三:Python发送邮件时中文附件下载乱码
- python_code_417
- 正确的CentOS系统配置
- uniyu 雷达波束_Unity使用TUIO协议接入雷达
- 第二课:基于树莓派的10个经典项目(树莓派能做什么)
- 当深度学习遇见自动文本摘要
- Python计算机视觉-仿射扭曲简单实例
- 中国人离婚率高达76.4%?这些指标背后真实的状况到底是什么样的?
- Copy Elision
- dva去掉访问路径中的“#”
- Linux ps命令详解,Linux查看进程
- 运营商,我看未必成为夕阳行业
- 笔记本计算机盖,怎么让笔记本盖子合上不待机-笔记本盖子合上 电脑继续运行的方法 - 河东软件园...
- Facebook创始人扎克伯格呼吁加强互联网监管