如何为“静态”创建变量借用?

问题描述 投票:0回答:5

vulkano
中,要创建
CPUAccessibleBuffer
,您需要为其提供一些数据,并且
CPUAccessibleBuffer::from_data
函数要求数据具有
'static
生命周期。

我在

&[u8]
数组(在运行时创建)中有一些数据,我想将其传递给该函数。

但是,此消息出错

argument requires that `data` is borrowed for `'static`

那么我怎样才能使数据的生命周期

'static

rust lifetime
5个回答
8
投票

如果您真的必须在运行时创建数据,并且您真的需要持续

'static
,那么您可以使用其中一种内存泄漏方法,例如
Box::leak
Vec::leak
来故意泄漏堆分配并确保它永远不会被释放。

虽然内存泄漏通常是人们会避免的事情,但在这种情况下,这实际上是一件明智的事情。从语义上讲,如果数据必须永远存在,那么泄漏它实际上是正确的做法。您希望内存被释放,永远不会,这正是内存泄漏时发生的情况。

示例:

fn require_static_data(data: &'static [u8]) {
    unimplemented!()
}

fn main() {
    let data = vec![1, 2, 3, 4];
    require_static_data(data.leak());
}

游乐场

也就是说,认真思考一下我领导的“真的”。确保您了解为什么您调用的代码需要 'static 数据,并问问自己为什么您的数据还没有

'static


6
投票

CpuAccessibleBuffer::from_iter

 来代替,它可以做同样的事情,但不要求集合是 
Copy
'static
:
let data: &[u8] = todo!();

let _ = CpuAccessibleBuffer::from_iter(
    device,
    usage,
    host_cached,
    data.iter().copied(), // <--- pass like so
);

或者如果你确实有
Vec<u8>

,可以直接传递:

let data: Vec<u8> = todo!();

let _ = CpuAccessibleBuffer::from_iter(
    device,
    usage,
    host_cached,
    data, // <--- pass like so
);



1
投票

static constant_value: i32 = 0;

但是,没有普遍适用的方法可以使任意数据静态化。这种类型的推断是由借用检查器在编译时进行的,而不是由程序员进行的。

通常,如果一个函数需要

'static

(类型)参数(如本例所示),则意味着少了任何参数都可能是不安全的,并且您需要重新组织数据流入和流出程序的方式以提供此类数据安全。不幸的是,这不是SO可以在这个问题的范围内提供的东西。

    



-3
投票
生命周期设为常量:

static NUM: i32 = 18;


© www.soinside.com 2019 - 2024. All rights reserved.