gpt4 book ai didi

memory-management - Rust 分配内存布局与大小不一致

转载 作者:行者123 更新时间:2023-11-29 08:17:28 24 4
gpt4 key购买 nike

我一定是在这里误解了什么,但我写了一段简单的代码来测试内存地址并得到了一些奇怪的结果:

代码如下:

使用 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::<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);
}

当我运行它时,我得到:

Raw pointer r1: 0x7fdb17402a60
Raw pointer r2: 0x7fdb17402a70
Raw pointer r3: 0x7fdb17402a80
Raw pointer r4: 0x7fdb17402a90
Raw pointer r5: 0x7fdb17402aa0

两个问题:

  1. 我看到根据文档 i32s 占用 4 个字节,那么为什么 r1 和 r2 之间的地址空间差异是 0x10 而不是 0x04?对于 r4 和 r5 之间的情况,我希望只有 1 个字节的偏移量。

  2. 为什么 alloc 返回的 *mut 8 足以作为指针?我们不能只用一个字节来表示 64 位虚拟内存地址吗?

我正在尝试了解 Rust 的这些不安全方面,因为我将在那里从事一些与内核相关的项目,并且有必要使用原始指针。

最佳答案

这个问题不是特定于 rust 的,而是关于内存分配如何工作的问题。内存分配器需要:

  • 考虑底层架构的对齐要求……例如,返回的指针可能希望被处理器字长整除;

  • 存储分配空间的大小(用于解除分配目的)

因此考虑分配单个 32 位整数......分配器将希望分配空间来存储:

  1. 用于存储分配空间大小的word;
  2. 32 位整数(在本例中占半个字)

由于分配希望是字对齐的,下一个分配将出现在第一个字之后的两个字或 16 个字节。

关于你的第二个问题,* mut u8 不占用一个字节,因为给定代码为其打印的值确实显示了这一点。

关于memory-management - Rust 分配内存布局与大小不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58370586/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com