结构体内存对齐,默认对齐数,结构体传参
我们先来计算一下结构体内存的大小
现在我们计算一下stu1和stu2每个成员内存偏移是多少。
在介绍偏移量之前,我们先简单介绍一下offsetof(是一个宏),它是用来计算结构体成员相较于起始位置的偏移量。
现在我们来详细介绍一下内存偏移是怎么回事
结构体内存对齐规则:
1.结构体的第一个成员直接对齐到相对于结构体变量起始位置为0的偏移处。
2.从第二个成员开始,要对齐到某个【对齐数】的整数倍的偏移处。
对齐数:结构体成员自身大小和默认对齐数的较小值。
Linux环境默认不设置对齐数(对齐数是结构体成员的自身大小)。
vs:默认对齐数8.
3.结构体总大小,必须是最大对齐数的整数倍。
每个结构体成员都有一个对齐数,其中最大的对齐数就是最大对齐数。
4.如果嵌套了结构体的情况
嵌套的结构体对齐到自己的最大对齐数的整数倍处。
结构体的整数大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
(这就是为什么虽然stu1和stu2的结构体成员变量虽然相同,但是因为成员变量顺序不同,根据对齐规则,所占内存大小也不相同)
为什么存在结构体内存对齐?
平台原因:
不是所有硬件平台都能访问任意地址上的任意数据,某些硬件平台只能在某些地址处取某些特定类型的数据,否则会抛出硬件异常。
性能原因:
数据结构(尤其是栈)应该尽可能在自然边界上对齐。
原因在于,为了访问为对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。
总体来说:
结构体内存对齐就是用空间换取时间的做法。(如果想要既满足对齐,又节省空间,那就要让占用空间小的成员尽量集中在一起)
默认对齐数:
默认对齐数可以自己设置的。
举个例子
结构体传参:
#include<stdio.h>
struct stu1
{int date[20];int num;
};
void print1(struct stu1 S)
{printf("%d %d %d\n", S.date[1],S.date[2], S.num);
}
void print2(struct stu1*p)
{printf("%d %d %d\n", (*p).date[1],(*p).date[2], (*p).num);printf("%d %d %d\n", p->date[1], p->date[2], p->num);
}
int main()
{struct stu1 S1 = { {1,2,3,4},20 };print1(S1);print2(&S1);return 0;
}
输出结果是一样的,那么这两种方式选择哪一种比较好呢,答案是第二种。
我们知道形参是实参的临时拷贝,采用第一种方式,print1函数需要开辟一部分空间给形参,用来存放实参传递的函数,这样内存消耗较多。采用第二种方式不需要开辟新的内存空间,print2函数只需要开辟一个4字节或者8字节的内存去存放传递过来的指针大小即可,再根据这个指针指向即可找到需要使用的数据,这样内存空间消耗相对于print1方法来说小很多。
结构体内存对齐,默认对齐数,结构体传参相关推荐
- 如何计算:结构体内存的大小(在结构体的考察中占据非常重要的地位)
在之前的文章中,笔者就结构体的简单定义,初始化,等内容,进行了简单描述!!但是,对于int ,double ,float ,char 等类型都有自己的大小,但是,对于一个结构体,它的大小该如何计算呢 ...
- 【C 语言】结构体 ( 结构体变量内存操作 | 通过 “ . “ 操作符操作结构体内存空间 | 通过 “ -> “ 操作符操作结构体内存空间 )
文章目录 一.通过 " . " 操作符操作结构体内存空间 二.通过 " -> " 操作符操作结构体内存空间 三.代码示例 一.通过 " . &q ...
- 【C语言】一文搞定如何计算结构体的大小----结构体内存对齐规则
要搞定如何正确地计算一个结构体的大小,我们就要深刻理解结构体内存对齐规则: 结构体内存对齐规则: 1.结构体的第一个成员永远在结构体起始位置偏移量为0的位置: 2.结构体成员从第二个成员开始,总是放在 ...
- 关于C语言中的结构体内存对齐与位段问题
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 结构体的内存对齐与位段 一.结构体的内存对齐 1.为什么会有内存对齐? 2.如何内存对齐 3. 如何在设计结构体的时候,既要 ...
- 语言结构体在内存的分布_结构体内存对齐,这篇文章给你彻底搞会!(干货收藏)...
脚本之家 你与百万开发者在一起 公众号:C语言编程 作者:薛定谔的coding猫 一.内存对齐的原因 1.平台原因(移植原因):一些资料上是这样说的,"不是所有的硬件平台都能访问任意地址上 ...
- c#往结构体里面读数据_结构体内存对齐,这回给你彻底搞会!
一.内存对齐的原因 1.平台原因(移植原因):一些资料上是这样说的,"不是所有的硬件平台都能访问任意地址上的任意数据:某些硬件平台只能在某些特定地址处取某些特定的数据,否则就会抛出硬件异常 ...
- printf打印结构体_工程师:这道题80%初学者都没做对!你确定搞懂结构体内存对齐了?...
这是工程师面试后的实际经历-- 这道经典.易错的关于C语言结构体内存对齐的题目,你真的会吗: 求32bit环境下以下结构体所占的字节数:typedef struct test_struct{ char ...
- C/C++结构体内存对齐问题
领会纲领: 综的说来就是结构体成员的对齐是用成员本身的大小和#pragma pack(push,n)中的n中较小的数对齐,例如如果成员大小为2,而你指定的对齐方式是4,则该成员按2对齐:结构本身的对其 ...
- 室友利用一把王者的时间就学会了【C语言结构体内存对齐】
文章目录 一.什么是结构体内存对齐? 二.结构体的对齐规则 结构体内存对齐规则的具体应用 三.为什么会存在内存对齐 总结 提示:以下是本篇文章正文内容,下面案例可供参考 一.什么是结构体内存对齐? 从 ...
最新文章
- Linux命令 -- ps
- CentOS7 redis-3.2.8 从单机到主从再到集群配置
- opengl加载显示3D模型lwx类型文件
- boost::geometry::range_by_section用法的测试程序
- 打开高效文本编辑之门_Linux sed之多行命令与循环命令
- Spring Boot 应用的测试
- .NET Core前后端分离快速开发框架(Core.3.1+AntdVue)
- LeetCode 1363. 形成三的最大倍数(贪心,难)
- 信息学奥赛一本通C++语言——1122:计算鞍点
- sql数据库的链接方式
- 账户体系、支付服务设计第一版
- php dede 发布时间_DedeCMS发布时间显示多少天月年前
- Python程序-生成回文
- Printf函数中%p代表什么数据类型
- 服务器虚拟cpu,服务器虚拟化 vcpu与内存配比
- windows设置路径Path
- 伪造邮件***,看我如何给网易邮箱APP发送垃圾邮件【二】
- 上周,维(系数字世界真)谛技术开了个大会
- 【Node.js】node入门全攻略
- 网络对抗技术---实验一
热门文章
- 玩转git之webhook应用初探
- Python 第三方模块 统计2 patsy,chowtest
- Paying More Attention to Self-attention: Improving Pre-trained Language Models via Attention Guiding
- 有计算机考试励志的文案,中考励志文案(精选50句)
- C语言程序设计--19春 形考任务1,南开19春学期(1709、1803、1809、1903)《C语言程序设计》在线作业-1辅导资料.docx...
- 如果一笔生意听起来好得让人难以置信
- 直播短视频带货完美运营APP源码 购物直播交友系统源码
- C语言将CSR存储模式转为coo,将大型稀疏矩阵转换为COO时出错(Error converting large sparse matrix to COO)...
- Quake1和2的pak资源文件格式说明
- JavaScript之DOM学习笔记