首页 > 解决方案 > 为什么在 Rust 中打印的内存地址是 40 位和 48 位地址的混合?

问题描述

我试图了解 Rust 处理内存的方式,并且我有一个打印一些内存地址的小程序:

fn main() {
    let a = &&&5;
    let x = 1;
    println!(" {:p}", &x);
    println!(" {:p} \n {:p} \n {:p} \n {:p}", &&&a, &&a, &a, a);
}

这将打印以下内容(因不同的运行而异):

0x235d0ff61c
0x235d0ff710 
0x235d0ff728 
0x235d0ff610 
0x7ff793f4c310

这实际上是 40 位和 48 位地址的混合。为什么会有这种混合?另外,有人可以告诉我为什么地址(2、3、4)不在以 8 字节分隔的位置(因为std::mem::size_of_val(&a)给出 8)?我在具有 24GB RAM 的 AMD x-64 处理器 (Phenom || X4) 上运行 Windows 10。

标签: memoryrust

解决方案


所有地址的大小都相同,Rust 只是不打印尾随的 0 位。

实际的内存布局是您的操作系统的一个实现细节,但是在a与所有其他变量不同的内存区域中打印一个位置的原因是,它a实际上存在于您加载的二进制文件中,因为它是一个已经可以通过以下方式计算的值编译器。所有其他变量都是在运行时计算并存在于堆栈中。

查看https://godbolt.org/z/kzSrDr上的编译结果:

.L__unnamed_4包含值 5;.L__unnamed_5,.L__unnamed_6并且.L__unnamed_1&5 &&5&&&5.

.L__unnamed_1您系统上的内容也是如此0x7ff793f4c310。While0x235d0ff???位于您的堆栈中,并在代码的红色和蓝色区域中计算。


推荐阅读