我们先来计算一下结构体内存的大小

现在我们计算一下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方法来说小很多。

结构体内存对齐,默认对齐数,结构体传参相关推荐

  1. 如何计算:结构体内存的大小(在结构体的考察中占据非常重要的地位)

    在之前的文章中,笔者就结构体的简单定义,初始化,等内容,进行了简单描述!!但是,对于int  ,double ,float ,char 等类型都有自己的大小,但是,对于一个结构体,它的大小该如何计算呢 ...

  2. 【C 语言】结构体 ( 结构体变量内存操作 | 通过 “ . “ 操作符操作结构体内存空间 | 通过 “ -> “ 操作符操作结构体内存空间 )

    文章目录 一.通过 " . " 操作符操作结构体内存空间 二.通过 " -> " 操作符操作结构体内存空间 三.代码示例 一.通过 " . &q ...

  3. 【C语言】一文搞定如何计算结构体的大小----结构体内存对齐规则

    要搞定如何正确地计算一个结构体的大小,我们就要深刻理解结构体内存对齐规则: 结构体内存对齐规则: 1.结构体的第一个成员永远在结构体起始位置偏移量为0的位置: 2.结构体成员从第二个成员开始,总是放在 ...

  4. 关于C语言中的结构体内存对齐与位段问题

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 结构体的内存对齐与位段 一.结构体的内存对齐 1.为什么会有内存对齐? 2.如何内存对齐 3. 如何在设计结构体的时候,既要 ...

  5. 语言结构体在内存的分布_结构体内存对齐,这篇文章给你彻底搞会!(干货收藏)...

    脚本之家 你与百万开发者在一起 公众号:C语言编程 作者:薛定谔的coding猫 一.内存对齐的原因  1.平台原因(移植原因):一些资料上是这样说的,"不是所有的硬件平台都能访问任意地址上 ...

  6. c#往结构体里面读数据_结构体内存对齐,这回给你彻底搞会!

    一.内存对齐的原因  1.平台原因(移植原因):一些资料上是这样说的,"不是所有的硬件平台都能访问任意地址上的任意数据:某些硬件平台只能在某些特定地址处取某些特定的数据,否则就会抛出硬件异常 ...

  7. printf打印结构体_工程师:这道题80%初学者都没做对!你确定搞懂结构体内存对齐了?...

    这是工程师面试后的实际经历-- 这道经典.易错的关于C语言结构体内存对齐的题目,你真的会吗: 求32bit环境下以下结构体所占的字节数:typedef struct test_struct{ char ...

  8. C/C++结构体内存对齐问题

    领会纲领: 综的说来就是结构体成员的对齐是用成员本身的大小和#pragma pack(push,n)中的n中较小的数对齐,例如如果成员大小为2,而你指定的对齐方式是4,则该成员按2对齐:结构本身的对其 ...

  9. 室友利用一把王者的时间就学会了【C语言结构体内存对齐】

    文章目录 一.什么是结构体内存对齐? 二.结构体的对齐规则 结构体内存对齐规则的具体应用 三.为什么会存在内存对齐 总结 提示:以下是本篇文章正文内容,下面案例可供参考 一.什么是结构体内存对齐? 从 ...

最新文章

  1. Linux命令 -- ps
  2. CentOS7 redis-3.2.8 从单机到主从再到集群配置
  3. opengl加载显示3D模型lwx类型文件
  4. boost::geometry::range_by_section用法的测试程序
  5. 打开高效文本编辑之门_Linux sed之多行命令与循环命令
  6. Spring Boot 应用的测试
  7. .NET Core前后端分离快速开发框架(Core.3.1+AntdVue)
  8. LeetCode 1363. 形成三的最大倍数(贪心,难)
  9. 信息学奥赛一本通C++语言——1122:计算鞍点
  10. sql数据库的链接方式
  11. 账户体系、支付服务设计第一版
  12. php dede 发布时间_DedeCMS发布时间显示多少天月年前
  13. Python程序-生成回文
  14. Printf函数中%p代表什么数据类型
  15. 服务器虚拟cpu,服务器虚拟化 vcpu与内存配比
  16. windows设置路径Path
  17. 伪造邮件***,看我如何给网易邮箱APP发送垃圾邮件【二】
  18. 上周,维(系数字世界真)谛技术开了个大会
  19. 【Node.js】node入门全攻略
  20. 网络对抗技术---实验一

热门文章

  1. 玩转git之webhook应用初探
  2. Python 第三方模块 统计2 patsy,chowtest
  3. Paying More Attention to Self-attention: Improving Pre-trained Language Models via Attention Guiding
  4. 有计算机考试励志的文案,中考励志文案(精选50句)
  5. C语言程序设计--19春 形考任务1,南开19春学期(1709、1803、1809、1903)《C语言程序设计》在线作业-1辅导资料.docx...
  6. 如果一笔生意听起来好得让人难以置信
  7. 直播短视频带货完美运营APP源码 购物直播交友系统源码
  8. C语言将CSR存储模式转为coo,将大型稀疏矩阵转换为COO时出错(Error converting large sparse matrix to COO)...
  9. Quake1和2的pak资源文件格式说明
  10. JavaScript之DOM学习笔记