Rust alloc内存布局与大小不一致

问题描述 投票:1回答:1

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

这里是代码:

使用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. 根据文档,我看到i32占用了4个字节,那么为什么r1和r2之间的地址空间差是0x10而不是0x04?对于r4和r5之间的情况,我希望只有1个字节的偏移量,这是同样的问题。

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

  3. 我正在尝试研究锈的这些不安全方面,因为我将在其中进行一些与内核相关的项目,并且有必要使用原始指针。

我一定在这里误解了一些东西,但是我写了一段简单的代码来测试内存地址,并且得到了一些奇怪的结果:这是代码:使用std :: alloc :: {alloc,Layout}; fn main(...

memory-management rust
1个回答
1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.