rust里的内存对齐
2024-10-19 11:41:39
内存对齐主要遵循下面三个原则:
- 结构体变量的起始地址能够被其最宽的成员大小整除
- 结构体每个成员相对于起始地址的偏移能够被其自身大小整除,如果不能则在前一个成员后面补充字节
- 结构体总体大小能够被最宽的成员的大小整除,如不能则在后面补充字
上代码
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 |
最新文章
- hibernate笔记--通过SchemaExport生成数据库表
- jquery自定义插件——window的实现
- 轻量级应用开发之(06)Autolayout自动布局1
- WebRTC学习资料大全
- Unit4中的Annotation
- Android 百度地图定位(手动+自动) 安卓开发教程
- android DatePickerDialog配合edittext实现按日期查询
- oracle 11G RAC会话故障转移测试
- Spring定时任务解决博客缓存数据更新问题
- vmware 解决 authentication token manipulation error
- time、datetime、calendar
- Session Cookie介绍和使用
- EntityFramework如何创建索引?
- linux (fedora 28) 制作启动U盘,启动盘
- 远程连接报错“This could be due to CredSSP encryption oracle remediation.”
- R语言的scale函数
- R中的高效批量处理函数(lapply sapply apply tapply mapply)(转)
- [COGS2580]偏序 II
- Python 基础 模块
- HDU 6470 Count 【矩阵快速幂】(广东工业大学第十四届程序设计竞赛 )