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
如何在不使用临时变量的情况下将文本强制转换为rust中的mut?_Rust - Fatal编程技术网

如何在不使用临时变量的情况下将文本强制转换为rust中的mut?

如何在不使用临时变量的情况下将文本强制转换为rust中的mut?,rust,Rust,这是用来传递给函数的*mut T pub unsafe fn a() { std::ptr::write_volatile(&581684,1); } 这当然会导致 error[E0308]: mismatched types --> src/lib.rs:2:30 | 2 | std::ptr::write_volatile(&581684,1); | ^^^^^^^ types differ in mutability | = note: exp

这是用来传递给函数的
*mut T

pub unsafe fn a() {
    std::ptr::write_volatile(&581684,1);
}
这当然会导致

error[E0308]: mismatched types
--> src/lib.rs:2:30
  |
2 | std::ptr::write_volatile(&581684,1);
  | ^^^^^^^ types differ in mutability
  |
 = note: expected raw pointer `*mut _`
              found reference `&{integer}`

在一行中执行此操作的正确方法是什么?

您可以使用
&mut 581684
,您可以将其转换为指针:

//在堆栈上写入581684_i32,然后用1_i32覆盖它
std::ptr::write_volatile(&mut 581684作为*mut_u,1);
但该代码非常可疑,因为它在堆栈上创建了一个临时的
i32
值,用
581684
填充它,并将其地址传递给
write\u volatile()
以用
1
填充它。由于地址在堆栈上,在运行时选择,并且没有任何特殊的方式,因此根本没有必要在那里写入
1
,而只是放弃该位置

如果您打算将值1写入一个固定地址(可能是硬件观察到的地址),那么
&address
不是您想要的。相反,您应该使用<代码>作为< /Cux>运算符,将地址作为整数转换为指针,就像您在C或C++中那样做。假设您要写入一个字节,它将如下所示:

// store 1u8 at address 581684
std::ptr::write_volatile(581684 as *mut _, 1u8);

“使用一个变量,即使在不再需要它的时候也可以保持它的寄存器”这是哪一年?几十年来,编译器一直能够对寄存器分配进行推理。@mcarton只不过,如果代码库很大,为了不占用太多编译时间或太多内存,一些琐碎的优化最终没有进行。因此,最好让编译器直接知道该值是一次性的。寄存器分配是一种局部优化。你的代码库是否庞大并不重要。据我所知,没有一个编译器会为了节省大型项目的编译时间而跳过这种常见的优化,如果值(显式变量或非显式变量)的来源信息在到达寄存器分配器时完全丢失,我也不会感到惊讶。@user2284570 mcarton是对的,使用对值的引用可能会编译为与使用临时变量相同的中间表示形式。但是这个变量是一个转移视线的问题——真正的问题是代码做了错误的事情,这是我在回答中提到的。@mcarton llvm?例如,在gcc上,这需要调整各种
--param
内部,这可能导致数百GB的ram使用。最好得到一条llvm指令,这将导致目标地址根本没有使用寄存器。