Rust 锈蚀是否按价值优化通过临时结构?

Rust 锈蚀是否按价值优化通过临时结构?,rust,Rust,假设我有一个锈迹斑斑的结构向量。建筑物相当大。当我想插入一个新的时,我编写如下代码: my_vec.push(MyStruct {field1: value1, field2: value2, ... }); 推送定义是 fn push(&mut self, value: T) 这意味着该值是按值传递的。我想知道Rust是先创建一个临时对象,然后复制到push函数,还是优化了代码,这样就不会创建和复制临时对象了?让我们看看: 编译为以下LLVM IR代码: %LotsOfBytes

假设我有一个锈迹斑斑的结构向量。建筑物相当大。当我想插入一个新的时,我编写如下代码:

my_vec.push(MyStruct {field1: value1, field2: value2, ... });
推送定义是

fn push(&mut self, value: T)
这意味着该值是按值传递的。我想知道Rust是先创建一个临时对象,然后复制到push函数,还是优化了代码,这样就不会创建和复制临时对象了?

让我们看看:

编译为以下LLVM IR代码:

%LotsOfBytes = type { [1024 x i8] }

; Function Attrs: noinline nounwind uwtable
define internal fastcc void @_ZN7consume20hf098deecafa4b74bkaaE(%LotsOfBytes* noalias nocapture dereferenceable(1024)) unnamed_addr #0 {
entry-block:
  %1 = getelementptr inbounds %LotsOfBytes* %0, i64 0, i32 0, i64 0
  tail call void @llvm.lifetime.end(i64 1024, i8* %1)
  ret void
}

; Function Attrs: nounwind uwtable
define internal void @_ZN4main20hf3cbebd3154c5390qaaE() unnamed_addr #2 {
entry-block:
  %lob = alloca %LotsOfBytes, align 8
  %lob1 = getelementptr inbounds %LotsOfBytes* %lob, i64 0, i32 0, i64 0
  %arg = alloca %LotsOfBytes, align 8
  %0 = getelementptr inbounds %LotsOfBytes* %lob, i64 0, i32 0, i64 0
  call void @llvm.lifetime.start(i64 1024, i8* %0)
  call void @llvm.memset.p0i8.i64(i8* %lob1, i8 0, i64 1024, i32 8, i1 false)
  %1 = getelementptr inbounds %LotsOfBytes* %arg, i64 0, i32 0, i64 0
  call void @llvm.lifetime.start(i64 1024, i8* %1)
  call void @llvm.memcpy.p0i8.p0i8.i64(i8* %1, i8* %0, i64 1024, i32 8, i1 false)
  call fastcc void @_ZN7consume20hf098deecafa4b74bkaaE(%LotsOfBytes* noalias nocapture dereferenceable(1024) %arg)
  call void @llvm.lifetime.end(i64 1024, i8* %1)
  call void @llvm.lifetime.end(i64 1024, i8* %0)
  ret void
}
这一行特别有趣:

call fastcc void @_ZN7consume20hf098deecafa4b74bkaaE(%LotsOfBytes* noalias nocapture dereferenceable(1024) %arg)
如果我理解正确,这意味着调用
consume
时会使用指向
LotsOfBytes
的指针,因此是的,RUSC会按值优化传递大型结构

call fastcc void @_ZN7consume20hf098deecafa4b74bkaaE(%LotsOfBytes* noalias nocapture dereferenceable(1024) %arg)