摘选自这位大神的博客

方法一:

结构体在内存中分配一块连续的内存,但结构体内的变量并不一定是连续存放的,这涉及到内存对齐。

原则1  数据成员对齐规则:结构(struct或联合union)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储)。

原则2  结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct b,b里有char,int,double等元素,那b应该从8的整数倍开始存储。)

原则3  收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。

方法二:

struct的内存大小为每个数据内存的加和,首先按照最大的数据类型进行单个分配如果前一个数据占用不了所有的内存,而剩下的内存可以放下下一个数据则第二个数据不另外分配内存(但是地址必须是从这个数据类型大小的整数倍开始,看下面的struct C),否则重新分配一个最大类型的内存

例题

链接:https://www.nowcoder.com/questionTerminal/8e8b73ee8f3a402ba47876f8e0b2b62d
来源:牛客网

在64位系统下,地址占64位
,即指针占64位,8个字节。

所以,*p所占的内存是这要的:
a【0-7】:本身占1个字节,因原则1,d起始位置需要是8的倍数,于是字节对齐占7个字节,共8个字节
d【8-15】:64位指针,占8字节
b【16-19】:占32位,4个字节
c:16 【20-23】:占16位,2个字节,因原则1,e起始位置需要是8的倍数,于是字节对齐占2个字节,共4个字节
e【24-32】:64位,8个字节
8 + 8 + 4 + 4 + 8 = 32

最新文章

  1. php js => splice 数组 插入 功能
  2. PHP学习第一天笔记——php的基本语法
  3. __proto__与prototype
  4. Java中检测字符串的编码格式
  5. Skrollr.js -- 使用Skrollr创建视差滚动效果页面
  6. (转)Tomcat的目录结构
  7. Android实例-监测网络状态及一些事件(XE8+小米2)
  8. TatukGIS-TGIS_ShapeArc.GetPointOnLine
  9. 2015 8月之后"云计算"学习计划
  10. python多线程实现售票
  11. PHP--高级算法--面试
  12. Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十九):服务消费(Ribbon、Feign)
  13. NOIP 2006 作业调度方案
  14. hdu 2444(二分图) The Accomodation of Students
  15. UIWebView加载CSS样式的html
  16. 〖Linux〗Ubuntu设定Proxy及忽略Proxy
  17. How Not to Crash #2: Mutation Exceptions 可变异常(不要枚举可变的集合)
  18. 如何在Eclipse中查看JDK以及Java框架的源码
  19. Android四大组件之Intent(续2)
  20. Codeforces Round #362(Div1) D Legen...(AC自动机+矩阵快速幂)

热门文章

  1. qt 维护x86和arm两套编译环境
  2. libevent for qt的讨论
  3. ZooKeeper+Dubbo+SpringBoot 微服务Demo搭建
  4. vue补充
  5. pytorch实现yolov3(1) yolov3基本原理
  6. SYN5104型 时间综合测试仪
  7. 基于 Roslyn 实现动态编译
  8. zabbix-3.2.6安装部署
  9. 攻防世界 web进阶练习 NewsCenter
  10. springboot-redis-crda example