在C语言中,我们的类型有两种一种是内置类型,另一种是自定义类型,今天我们来看一下自定义类型占用字节数的计算

首先我们知道自定义类型中包含一些内置类型,其中内置类型的大小我们是知道的,那么自定义类型的大小是不是里面内置类型直接加起来呢?

我们来看一下

首先我们要知道,自定义类型的大小不是按照里面包含的内置类型的大小加起来的

我们可以看到,结构体的大小计算是存在内存对齐的,其中像上图说明的一样,我们一条一条来看

首先该结构体中a应该放在该结构体内存存放位置的0字节位置,所以直接放在前四个字节,然后下面是char类型,但是从第二个变量开始就需要放在对齐数的整数倍处,而因为是char类型又因为char类型的对齐数是1,而4是1的倍数所以,刚好可以,而下面是short类型,对齐数是2所以需要放在2的倍数处,这里橙色的是被浪费掉的空间,所以这里也开始放两个字节,而下面的同样是short类型而8刚好是2的整数倍,所以不需要额外浪费空间,在放两个字节,而结构体的最终大小并不是这样就结束了,而最终大小是该结构体中成员的最大的对齐数,的整数倍所以最终该结构体的大小为12个字节

下面我们在看几个结构体(老铁们自己对照观看)

这两个也是同样如此

我们介绍一下下面的一个

我们介绍一下这个,我们可以看到这个结构体中包含另外一个结构体,而结构体的基本类型和其他的结构体计算大小没有区别,但是里面包含的结构在对齐的时候需要找到结构体中的最大对齐数进行对齐,然后将该结构体的最终字节数给放进去,而这个结构体的最终大小同样也是按照该结构体中所有的成员里面的最大对齐数的倍数,这里面的最大对齐数包含里面结构体里面的成员。

关于结构体的内存对齐,以及如何计算相关推荐

  1. c 定义结构体时提示应输入声明_C++|了解结构体的内存对齐(成员声明的顺序影响占用空间大小)...

    我们使用的电子计算机绝大部分都是冯·诺依曼结构的机器,遵循"存储程序"的概念.数据处理以存储为前提,在编程中数据如何"存得进去,取得出来",并且符合空间.时间效 ...

  2. 自定义类型详解:结构体(内存对齐、位段) + 枚举 + 联合

    目录 一.结构体 1.特殊的声明 2.结构体自引用 3.结构体变量的定义和初始化 4.打印结构体 二.==结构体内存对齐== 1.内存对齐 结构体嵌套如何求 为什么存在内存对齐? 2.修改默认对齐数 ...

  3. C语言:指针的偏移步长、结构体成员的偏移量、嵌套结构体成员的偏移量、结构体的内存对齐

    文章目录 1 不同类型指针的偏移步长 2 结构体成员的偏移量 3 嵌套结构体成员的偏移量 4 结构体的内存对齐 4.1 内存对齐的原因与优点 4.2 结构体内存对齐的规则 4.3 结构体嵌套结构体时的 ...

  4. 结构体的内存对齐规则

    1.结构体的内存对齐规则 1.第一个成员在与结构体变量偏移量为0的地址处. 2.其他成员变量都放在对齐数(成员的大小和默认对齐数的较小值)的整数倍的地址处. 对齐数=编译器默认的一个对齐数与该成员大小 ...

  5. 字节对齐《c和指针》笔记--包含位域结构体的内存对齐(32bit,GCC)

    最近使用开发的过程中出现了一个小问题,顺便记录一下原因和方法--字节对齐 C99划定int.unsigned   int和bool可以作为位域类型.但编译器几乎都对此作了扩展,答应其它类型类型的存在. ...

  6. 3.c语言结构体成员内存对齐详解

    一.关键一点 最关键的一点:结构体在内存中是一个矩形,而不是一个不规则形状 二.编程实战 1 #include <stdlib.h> 2 #include <stdio.h> ...

  7. C语言--结构体与内存对齐准则简单理解

    平时基本不涉及这个问题,被问起才发现没那么简单... 一,结构体:内存中所有类型字节之和 #include<stdio.h> struct icd {int a;char b;double ...

  8. [转]C++结构体|类 内存对齐详解

    内存地址对齐,是一种在计算机内存中排列数据(表现为变量的地址).访问数据(表现为CPU读取数据)的一种方式,包含了两种相互独立又相互关联的部分:基本数据对齐和结构体数据对齐 . 为什么需要内存对齐?对 ...

  9. 基于STM32使用嵌套结构体摸索内存对齐

    导读 一.结构体的声明以及初始化 二.结构体成员的内存对齐规则 三.联合体以及嵌套结构体的用法 位段 小端模式 三.位段数据跨字节单位导致的内存对齐现象 用来描述对象特征的各类信息,通常会被整合成记录 ...

最新文章

  1. webpack 占位符_通过示例学习Webpack:占位符图像模糊
  2. python rpc框架-python使用rpc框架gRPC的方法
  3. shell开启飞行模式_今天才知道,原来手机的飞行模式用处那么多,看完涨知识了...
  4. 商海致富独家秘诀:微笑可以当钱花
  5. java 设计作业——简单计算器
  6. 关于SQL Server 数据 出现(可疑)不可用状态的解决办法
  7. 滤波电容的选择(调试中)
  8. 第三章 对象与JSON
  9. C#LeetCode刷题之#541-反转字符串 II(Reverse String II)
  10. ZOJ 3761 Easy billiards 月赛E DFS
  11. Atitit 身份证与银行卡校验规则
  12. 故宫商业大跃进 逐渐失控的IP洪流
  13. java冒泡排序(含冒泡排序代码)
  14. B75经典门户商业版Discuz模板下载
  15. 自己总结出三种进入加密QQ空间的方法
  16. 网络传输中的那些编码之-chr和hex(base16)
  17. 寻求持续发展 Criteo中国业务正式启动
  18. 云产品学习之路(阿里云01)阿里云rds数据库导出
  19. 【毕业设计系列】033:基于MATLAB语言的实时变声器系统【含Matlab源码】
  20. 高并发时,读文件、读SESSION、读缓存(Redis)和读数据库(Mysql)的查询效率哪家强?

热门文章

  1. 进不去系统rpc服务器不可用,WinXP系统RPC服务器不可用怎么办?
  2. 数据库原理与应用——引言(一)
  3. Flutter 从 TextField 安全泄漏问题深入探索文本输入流程
  4. 1000元购物卷买票
  5. 守恒定律、连续性方程和玻印亭矢量
  6. chrome浏览器的默认超时时间
  7. SenseTime Ace Coder Challenge 暨 商汤在线编程挑战赛 D. 白色相簿
  8. 数据治理工作的几种推进套路
  9. 人工智能伦理风险治理具有复杂性,尚未形成完善的理论架构和治理体系
  10. 面试题 10.11. 峰与谷-快速排序