There are two parts to a Vec.
- The Vec structure itself, this is a fixed size structure consisting of a pointer and two pointer-sized integers for size and capacity. So it is three pointers (12 bytes on 32-bit, 24 bytes on 64-bit) in size.
- A block of memory on the heap, which stores the elements of the vector.
When a Vec is returned the vec structure itself is logically "moved" by value. The block of memory on the heap is untouched.
The rust language does not specify exactly how the vec structure is moved. However, for the most part, rustc follows the standard calling conventions for the target platform. Both amd64 and aarch64 return small structures in registers, but their normal definition of "small structures" is structures up to two pointers in size. Above that they flip to their strategy for "large structures" which is to replace them with a pointer.
To demonstrate this I built the following code on godbolt.
#[inline(never)]
pub fn vecofints(v: Vec<i32>) -> Vec<i32> {
return v;
}
On x86-64 this resulted in.
example::vecofints::h4b8b50ca2c3019a3:
mov rax, rdi
mov rcx, qword ptr [rsi + 16]
mov qword ptr [rdi + 16], rcx
movups xmm0, xmmword ptr [rsi]
movups xmmword ptr [rdi], xmm0
ret
We can see in this case, that both the argument and the result are passed as pointers, with a pointer to the argument being passed in rsi (the first argument passing register) and a pointer to the result being passed in rdi (the second argument passing register).
On aarch64 this resulted in.
example::vecofints::hee34a085ad28128f:
ldr q0, [x0]
ldr x9, [x0, #16]
str q0, [x8]
str x9, [x8, #16]
ret
Which is very similar except rather than passing the hidden pointer for the return value in one of the parameter passing registers, aarch64 has a dedicated register for that purpose.
It's possible to implement a vec-like type, where the Vec structure itself is only one pointer in size, there are a few of them out there often with names like "thinvec".
return
keyword at the end of a block. Instead, you leave off thereturn
and the semicolon. – Deify