memory - 为什么在 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。
解决方案
所有地址的大小都相同,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???
位于您的堆栈中,并在代码的红色和蓝色区域中计算。
推荐阅读
- c# - 在 Oracle 11g 中不使用 C# 导入 Null 值
- javascript - rails - vuejs(axios) - cannot print JSON response from localhost to console
- python-3.x - Find last two characters in a list of words
- c# - Raspbian -.net core application won't reload configuration
- apache - How to use sendBodyAndProperty in camel
- css - CSS can't load because of MIME type on one page, but works fine on another page
- python - Handling logger directory when importing a class into another file in child folder
- r - R中列中n个值的平均值 - 重复
- laravel-5 - laravel 的翻译管理器包
- python - 如果给定的元素存在于子列表中,Python 返回子列表的元素