gpt4 book ai didi

memory - 为什么Rust中的打印内存地址同时包含40位和48位地址?

转载 作者:行者123 更新时间:2023-12-03 11:40:33 27 4
gpt4 key购买 nike

我试图了解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。当0x235d0ff???在您的堆栈上并在代码的红色和蓝色区域中计算时。

关于memory - 为什么Rust中的打印内存地址同时包含40位和48位地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61074474/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com