Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory management Rust alloc内存布局与大小不一致_Memory Management_Rust - Fatal编程技术网

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

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::&

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

代码如下:

使用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);
}  
两个问题:

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

  • 为什么*mut 8作为指针就足够了,它是
    alloc
    返回的值?我们不能仅仅用一个字节来表示64位虚拟内存地址,对吗


  • 我正试图学习生锈的这些不安全方面,因为我将在那里从事一些与内核相关的项目,有必要使用原始指针

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

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

    • 存储已分配空间的大小(用于取消分配)

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

  • 用于存储所分配空间大小的字
  • 32位整数(本例中为半个字)
  • 由于分配希望字对齐,下一次分配将发生在第一次分配后的两个字或16个字节


    至于你的第二个问题,一个
    *mut u8
    没有占用一个字节,正如为它打印的给定代码所显示的那样。

    一个
    *mut u8
    没有占用一个字节。。。
    Raw pointer r1: 0x7fdb17402a60
    Raw pointer r2: 0x7fdb17402a70
    Raw pointer r3: 0x7fdb17402a80
    Raw pointer r4: 0x7fdb17402a90
    Raw pointer r5: 0x7fdb17402aa0