私はTypedArena
に基づいてメモリプールを実装しようとしています。錆の寿命に関する質問
#![feature(rustc_private)]
extern crate arena;
use arena::TypedArena;
pub struct MemoryPool {
arena: TypedArena<Vec<u8>>,
bytes_allocated: usize,
}
impl MemoryPool {
pub fn consume(&mut self, buf: Vec<u8>) -> &[u8] {
self.bytes_allocated += buf.capacity();
self.arena.alloc(buf)
}
}
pub struct ByteArray<'a> {
data: &'a [u8],
}
impl<'a> ByteArray<'a> {
pub fn set_data(&mut self, data: &'a [u8]) {
self.data = data;
}
}
pub struct S<'a> {
pool: &'a mut MemoryPool,
}
impl<'a> S<'a> {
pub fn write(&mut self, buffer: &mut ByteArray<'a>) {
let v = vec!();
let data = self.pool.consume(v);
buffer.set_data(data);
}
}
しかし、コンパイラはライン文句:let data = self.pool.consume(v);
:
error[E0495]: cannot infer an appropriate lifetime for autoref due to conflicting requirements
--> <anon>:34:26
|
34 | let data = self.pool.consume(v);
| ^^^^^^^
|
note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the body at 32:54...
--> <anon>:32:55
|
32 | pub fn write(&mut self, buffer: &mut ByteArray<'a>) {
| _______________________________________________________^ starting here...
33 | | let v = vec!();
34 | | let data = self.pool.consume(v);
35 | | buffer.set_data(data);
36 | | }
| |___^ ...ending here
note: ...so that reference does not outlive borrowed content
--> <anon>:34:16
|
34 | let data = self.pool.consume(v);
| ^^^^^^^^^
note: but, the lifetime must be valid for the lifetime 'a as defined on the body at 32:54...
--> <anon>:32:55
|
32 | pub fn write(&mut self, buffer: &mut ByteArray<'a>) {
| _______________________________________________________^ starting here...
33 | | let v = vec!();
34 | | let data = self.pool.consume(v);
35 | | buffer.set_data(data);
36 | | }
| |___^ ...ending here
note: ...so that types are compatible (expected &mut ByteArray<'_>, found &mut ByteArray<'a>)
--> <anon>:35:12
|
35 | buffer.set_data(data);
| ^^^^^^^^
私の質問は次のとおりです。ここに私の元のコードの簡易版です
data
がない理由一生持ちました'a
?pool
の有効期間はa
で、consume
はself
と同じ寿命を返しますので、寿命は'a
である必要があります。このコードを意図したとおりに動作させるにはどうすればよいでしょうか?基本的には、新しいバイトを割り当てて、メモリプールと同じになるように寿命を調整したいと思います。私は
alloc
がmut
の参照を取っていないので、TypedArena
を直接使用できることを知っています。しかし、私は本当にbytes_allocated
のような他の情報を追跡したい。
ありがとうございました。私は、私が持っていた混乱は、 'self.pool'が' pool'の代わりに 'self'の生涯を持ち、' pool'が変更可能であるということでした。これは、プールに付けられた生涯の注釈 '' a''があるので直観的ではありません。コードを修正するために、 '' self'に '' b''を追加するのではなく、他の提案がありますか?構造体 'S'が' 'a'よりも短いと予想されるため、これは私の元のコードでは機能しません。 –
@ChaoSunそれはできません。 'MemoryPool'はそれ自身よりも長い参照を返すことはできず、' S'はそれ自身よりも長いものを参照するものを返すことができず、 'S :: pool'は' S' 。私はあなたが達成しようとしていることをはっきりとは分かりません。 –
説明をありがとう。私はこのことを再設計する必要があると思う。 –