【问题标题】:Rust alloc memory layout not consistent with sizeRust 分配内存布局与大小不一致
【发布时间】:2020-02-10 17:06:36
【问题描述】:

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

代码如下:

使用 std::alloc::{alloc, 布局};

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 的这些不安全方面,因为我将从事一些与内核相关的项目,并且有必要使用原始指针。

【问题讨论】:

  • 一个*mut u8不占用一个字节...

标签: memory-management rust


【解决方案1】:

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

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

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

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

  1. 用于存储分配空间大小的单词;
  2. 32 位整数(在这种情况下占用半个字)

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

关于您的第二个问题,* mut u8 不占用单个字节,正如为其打印的给定代码所显示的值一样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 2013-11-30
    • 1970-01-01
    • 2022-12-05
    • 2015-12-14
    • 2015-02-17
    • 1970-01-01
    相关资源
    最近更新 更多