Closed xiaohaowudi closed 3 years ago
书中原文102页23行中描述std::mem::size_of()计算出的结构体A的大小为8字节,但是内存分布图绘制错误,实际上类似的结构体在C++中按照4字节对齐,大小应该是12字节,rust中占用为8字节是因为编译器重新排列了a, b, c三个字段的顺序,让顺序变为了b --- c ----a, 将b起始地址对齐到4字节整除的地址位置,然后c紧接其后,c的地址是2字节整除的,最后的a的起始地址是1字节整除的(此内存布局可以通过LLDB调试器验证),原书中图4-8的对齐之后的内存布局似乎是错误的,所以102页末尾到103页开始关于A结构体占用内存大小为什么是8的论述似乎并不准确,可能误导读者,对内存布局造成错误理解,本人在rust 1.49.0版本上实验,结构体A实际内存布局与书中所讲有出入
@xiaohaowudi 看一下随时源码的勘误,目测你说的问题和内存重排有关系。看一下相关issues:https://github.com/ZhangHanDong/tao-of-rust-codes/issues
@ZhangHanDong 喔,好的,已经看到重复的issue了,应该是同一个问题
页码与行数
文本或排版错误
书中原文102页23行中描述std::mem::size_of()计算出的结构体A的大小为8字节,但是内存分布图绘制错误,实际上类似的结构体在C++中按照4字节对齐,大小应该是12字节,rust中占用为8字节是因为编译器重新排列了a, b, c三个字段的顺序,让顺序变为了b --- c ----a, 将b起始地址对齐到4字节整除的地址位置,然后c紧接其后,c的地址是2字节整除的,最后的a的起始地址是1字节整除的(此内存布局可以通过LLDB调试器验证),原书中图4-8的对齐之后的内存布局似乎是错误的,所以102页末尾到103页开始关于A结构体占用内存大小为什么是8的论述似乎并不准确,可能误导读者,对内存布局造成错误理解,本人在rust 1.49.0版本上实验,结构体A实际内存布局与书中所讲有出入