Trame2771
@Trame2771

Вернуть владение значения типа структуры из функции на самом деле не возвращение владения, а поинтера на heap?

Есть такая функция:
#[inline(never)]
fn give_str() -> String {
    String::from("inner")
}

Эта функция всего лишь синтаксический сахар для этой функции?:
#[inline(never)]
fn give_str() -> Box<String> {
    Box::new(String::from("inner"))
}

Только с вызывающей стороны весь функционал поинтера отбрасывается, но по сути это же поинтер? Я имею в виду в ассемблере. Эти две функции один и тот же ассемблер выдадут? Ведь нет какой-то волшебной операции вернуть владение
  • Вопрос задан
  • 66 просмотров
Решения вопроса 1
vabka
@vabka Куратор тега Rust
Нет, эти два примера кода будут делать абсолютно разные вещи.
В первом случае ты возвращаешь 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
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы