内存对齐主要遵循下面三个原则:

  1. 结构体变量的起始地址能够被其最宽的成员大小整除
  2. 结构体每个成员相对于起始地址的偏移能够被其自身大小整除,如果不能则在前一个成员后面补充字节
  3. 结构体总体大小能够被最宽的成员的大小整除,如不能则在后面补充字

上代码


struct A {
  a: u8,
  b: u32,
  c: u16,
  d: u8,
  e: u8,
} fn main() {
  let a = A{a:1,b:1,c:1,d:1,e:1};
  println!("{:?}", std::mem::size_of::<A>());
  println!("{:p}", &a);
  println!("{:p}", &a.a);
  println!("{:p}", &a.b);
  println!("{:p}", &a.c);
  println!("{:p}", &a.d);
  println!("{:p}", &a.e);
}

按一般理解,A的内存图应该是

a x x x b b b b c c d e x x

总字节数应该是14

但是输出为

12
0x18e94ff788
0x18e94ff78e
0x18e94ff788
0x18e94ff78c
0x18e94ff78f
0x18e94ff790

可以发现rust编译器将a,b,c,d,e的位置调换了

内存图如下

b b b b c c a d e x x x

最新文章

  1. hibernate笔记--通过SchemaExport生成数据库表
  2. jquery自定义插件——window的实现
  3. 轻量级应用开发之(06)Autolayout自动布局1
  4. WebRTC学习资料大全
  5. Unit4中的Annotation
  6. Android 百度地图定位(手动+自动) 安卓开发教程
  7. android DatePickerDialog配合edittext实现按日期查询
  8. oracle 11G RAC会话故障转移测试
  9. Spring定时任务解决博客缓存数据更新问题
  10. vmware 解决 authentication token manipulation error
  11. time、datetime、calendar
  12. Session Cookie介绍和使用
  13. EntityFramework如何创建索引?
  14. linux (fedora 28) 制作启动U盘,启动盘
  15. 远程连接报错“This could be due to CredSSP encryption oracle remediation.”
  16. R语言的scale函数
  17. R中的高效批量处理函数(lapply sapply apply tapply mapply)(转)
  18. [COGS2580]偏序 II
  19. Python 基础 模块
  20. HDU 6470 Count 【矩阵快速幂】(广东工业大学第十四届程序设计竞赛 )

热门文章

  1. netty系列之:netty中常用的字符串编码解码器
  2. 并发编程系列之Lock锁可重入性与公平性
  3. c++:-9
  4. Java 对象实现 Serializable 的原因
  5. typora的下载和基本的使用
  6. awk-文本处理【中文手册版】
  7. Fail2ban 命令详解 fail2ban-client
  8. 基于PYQT5的截图翻译工具
  9. cloudwu/coroutine 源码分析
  10. Redis - 为什么 Redis 是单线程的?