文章 - 从零开始构建数据类型
“从零开始” 构建意味着使用不安全的方法手动初始化每个字段,例如在 MaybeUninit
中,然后调用assume_init()
。文章详细介绍了如何使用 offset_of!
宏来逐步构建结构体或数组的每个字段,甚至是嵌套字段,并通过具体代码示例展示了这一过程。
use core::mem::{MaybeUninit, offset_of};
let mut out = MaybeUninit::<Example>::uninit();
let val = unsafe {
let ptr: *mut Example = out.as_mut_ptr();
ptr.byte_add(offset_of!(Example, a)).cast::<u32>().write(5u32);
ptr.byte_add(offset_of!(Example, b)).cast::<u8>().write(6u8);
ptr.byte_add(offset_of!(Example, c)).cast::<i64>().write(7i64);
out.assume_init()
};
println!("{val:#?}");
Building Plain Old Data from Scratch: https://onevariable.com/blog/pods-from-scratch/
文章 - 静态大小、动态大小和其他。
这篇文章讨论了作者在开发 Rust 到 .NET 编译器时遇到的一个复杂的编程错误,展示了编译器开发中错误调试的挑战和复杂性。
文章中提到,由于编译器的一个假设错误,任何尝试格式化字符串的 Rust 程序都会崩溃。作者探索了导致这一问题的原因,包括标签处理错误和对枚举类型的错误假设。
此外,作者还讨论了在 Mono 和 CoreCLR 中处理调试信息的不同方式,以及解决这些问题的方法。最终,通过插入运行时检查和改进调试信息处理,逐步揭示问题的根本原因。
Statically Sized, dynamically sized, and other.: https://fractalfir.github.io/generated_html/rustc_codegen_clr_v0_1_3.html
This Week In Rust 550
新一期的 Rust 周报速递发布,快来看看有哪些内容你曾经关注过 :)
This Week In Rust 550: https://this-week-in-rust.org/blog/2024/06/05/this-week-in-rust-550/
From 日报小组 PsiACE
社区学习交流平台订阅:
评论区
写评论还没有评论