Memory management Rust alloc内存布局与大小不一致
我一定是误解了什么,但我写了一段简单的代码来测试内存地址,得到了一些奇怪的结果: 代码如下: 使用std::alloc::{alloc,Layout}Memory management Rust alloc内存布局与大小不一致,memory-management,rust,Memory Management,Rust,我一定是误解了什么,但我写了一段简单的代码来测试内存地址,得到了一些奇怪的结果: 代码如下: 使用std::alloc::{alloc,Layout} fn main() { let r1 : *mut i32; let r2 : *mut i32; let r3 : *mut i32; let r4 : *mut u8; let r5 : *mut i32; unsafe { r1 = alloc(Layout::new::&
fn main() {
let r1 : *mut i32;
let r2 : *mut i32;
let r3 : *mut i32;
let r4 : *mut u8;
let r5 : *mut i32;
unsafe {
r1 = alloc(Layout::new::<i32>()) as *mut i32;
r2 = alloc(Layout::new::<i32>()) as *mut i32;
r3 = alloc(Layout::new::<i32>()) as *mut i32;
r4 = alloc(Layout::new::<i8>());
r5 = alloc(Layout::new::<i32>()) as *mut i32;
}
println!("Raw pointer r1: {:p}", r1);
println!("Raw pointer r2: {:p}", r2);
println!("Raw pointer r3: {:p}", r3);
println!("Raw pointer r4: {:p}", r4);
println!("Raw pointer r5: {:p}", r5);
}
两个问题:
alloc
返回的值?我们不能仅仅用一个字节来表示64位虚拟内存地址,对吗我正试图学习生锈的这些不安全方面,因为我将在那里从事一些与内核相关的项目,有必要使用原始指针 这个问题不是特定的,而是关于内存分配如何工作的问题。内存分配器需要:
- 考虑底层架构的对齐要求。。。例如,返回的指针可能希望被处理器字大小整除
- 存储已分配空间的大小(用于取消分配)
因此考虑分配一个32位整数…分配器希望分配空间来存储:
至于你的第二个问题,一个
*mut u8
没有占用一个字节,正如为它打印的给定代码所显示的那样。一个*mut u8
没有占用一个字节。。。
Raw pointer r1: 0x7fdb17402a60
Raw pointer r2: 0x7fdb17402a70
Raw pointer r3: 0x7fdb17402a80
Raw pointer r4: 0x7fdb17402a90
Raw pointer r5: 0x7fdb17402aa0