gpt4 book ai didi

rust - 如何在稳定的 Rust 中分配堆上的结构而不占用堆栈上的空间?

转载 作者:行者123 更新时间:2023-11-29 08:29:14 27 4
gpt4 key购买 nike

在这段代码中...

struct Test { a: i32, b: i64 }

fn foo() -> Box<Test> { // Stack frame:
let v = Test { a: 123, b: 456 }; // 12 bytes
Box::new(v) // `usize` bytes (`*const T` in `Box`)
}

...据我所知(忽略可能的优化),v 在堆栈上分配,然后复制到堆中,然后返回到 Box .

还有这段代码...

fn foo() -> Box<Test> {
Box::new(Test { a: 123, b: 456 })
}

...应该没有任何不同,大概是因为应该有一个用于结构分配的临时变量(假设编译器对 Box::new()< 中的实例化表达式没有任何特殊语义)。

我找到了 Do values in return position always get allocated in the parents stack frame or receiving Box? 。关于我的具体问题,它只提出了实验性的box语法,但主要是谈论编译器优化(复制省略)。

所以我的问题仍然存在:使用 stable Rust,如何在不依赖编译器优化的情况下直接在堆上分配 struct

最佳答案

从 Rust 1.39 开始,在稳定版中似乎只有一种方法可以直接在堆上分配内存——使用 std::alloc::alloc (请注意,文档声明它预计将被弃用)。这相当不安全。

例子:

#[derive(Debug)]
struct Test {
a: i64,
b: &'static str,
}

fn main() {
use std::alloc::{alloc, dealloc, Layout};

unsafe {
let layout = Layout::new::<Test>();
let ptr = alloc(layout) as *mut Test;

(*ptr).a = 42;
(*ptr).b = "testing";

let bx = Box::from_raw(ptr);

println!("{:?}", bx);
}
}

不稳定的方法中使用了这种方法Box::new_uninit .

事实证明,甚至还有一个箱子可以避免 memcpy 调用(除其他外):copyless .这个 crate 也使用了基于此的方法。

关于rust - 如何在稳定的 Rust 中分配堆上的结构而不占用堆栈上的空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54247229/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com