Performance 为什么文字值在放入堆之前会从只读内存复制到堆栈?
当我使用Rust进行实验时,我注意到如果使用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
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];