Нет, эти два примера кода будут делать абсолютно разные вещи.
В первом случае ты возвращаешь String, который содержит в себе несколько полей: len, capacity, и указатель на буфер.
Во втором случае ты String ещё в кучу копируешь и возвращаешь указатель на String в куче.
В этом ты легко можешь убедиться, если посмотришь на ассемблер.
Ведь нет какой-то волшебной операции вернуть владение
Она не волшебная, и она существует. Только владение не возвращается, а передаётся.
Но существует только на уровне типов.
https://play.rust-lang.org/?version=stable&mode=re...
Первая функция:
pushq %rbx
movq %rdi, %rbx
movq __rust_no_alloc_shim_is_unstable@GOTPCREL(%rip), %rax
movzbl (%rax), %eax
movl $5, %edi
movl $1, %esi
callq *__rust_alloc@GOTPCREL(%rip)
testq %rax, %rax
je .LBB10_1
movb $114, 4(%rax)
movl $1701736041, (%rax)
movq %rax, (%rbx)
movq $5, 8(%rbx)
movq $5, 16(%rbx)
popq %rbx
retq
Вторая:
pushq %r14
pushq %rbx
pushq %rax
movq __rust_no_alloc_shim_is_unstable@GOTPCREL(%rip), %r14
movzbl (%r14), %eax
movl $5, %edi
movl $1, %esi
callq *__rust_alloc@GOTPCREL(%rip)
testq %rax, %rax
je .LBB11_6
movq %rax, %rbx
movb $114, 4(%rax)
movl $1701736041, (%rax)
movzbl (%r14), %eax
movl $24, %edi
movl $8, %esi
callq *__rust_alloc@GOTPCREL(%rip)
testq %rax, %rax
je .LBB11_2
movq %rbx, (%rax)
movq $5, 8(%rax)
movq $5, 16(%rax)
addq $8, %rsp
popq %rbx
popq %r14
retq