Performance 为什么文字值在放入堆之前会从只读内存复制到堆栈?

Performance 为什么文字值在放入堆之前会从只读内存复制到堆栈?,performance,rust,code-generation,Performance,Rust,Code Generation,当我使用Rust进行实验时,我注意到如果使用Box::new从一个文本创建一个装箱数组,则会有额外的从只读内存复制到堆栈的操作。为什么Rust编译器不能直接从只读内存复制到堆上分配的空间 锈代码片段: fn main() { let v: Box<[u32]> = Box::new([1u32,2,3456,4,5,6]); println!("vector {}", v.len()); } 数组位于二进制文件中的0x39ad0和const1050: 0000000

当我使用Rust进行实验时,我注意到如果使用
Box::new
从一个文本创建一个装箱数组,则会有额外的从只读内存复制到堆栈的操作。为什么Rust编译器不能直接从只读内存复制到堆上分配的空间

锈代码片段:

fn main() {
    let v: Box<[u32]> = Box::new([1u32,2,3456,4,5,6]);
    println!("vector {}", v.len());
}
数组位于二进制文件中的
0x39ad0
const1050

0000000000039ac8         db  0x80 ; '.'
0000000000039ac9         db  0x0d ; '.'
0000000000039aca         db  0x00 ; '.'
0000000000039acb         db  0x00 ; '.'
0000000000039acc         db  0x04 ; '.'
0000000000039acd         db  0x00 ; '.'
0000000000039ace         db  0x00 ; '.'
0000000000039acf         db  0x00 ; '.'
0000000000039ad0         dq  0x0000000600000005                          ; XREF=_ZN4main20h90e2c514439f0097eaaE+52

你的发现是正确的;这就是
Box::new()
是常规函数的结果

将值直接放在堆上的正确方法是使用placement操作符;然而,目前Rust中没有此类产品,但有两个RFC,(已接受)和(待定,但似乎很可能接受)。此外,如果您每晚都在使用Rust,则可以使用不稳定的
语法:

let v: Box<[u32]> = box [1u32,2,3456,4,5,6];
设v:Box=Box[1u32,23456,4,5,6];
let v: Box<[u32]> = box [1u32,2,3456,4,5,6];