5

私は最近 Rust について多くのことを読みましたが、まだ酸化し始めたばかりです。私の脳はほとんどの C/C++ 反射神経を保持しているため、Rust での処理方法が原因でこの質問が関係ない場合はご容赦ください。

一般に、任意のサイズのブロックをヒープに割り当ててから、メモリの小さなチャンクの所有権を取得するバインディングを使用してデータ構造をその上にマップすることは可能ですか (望ましいですか?)。

C99 を使用すると、次のように記述できます。

typedef unsigned char BYTE;

typedef struct {
    size_t size;
    BYTE payload[];
} flex;

// ...

flex * flex_new(size_t _size) {
    flex *f = malloc(sizeof(flex) + _size * sizeof(BYTE));
    f->size = _size;
    return f;
}

可変長の配列は、可変サイズのチャンクでメモリ プールを実装する場合や、スレッド専用のヒープにメモリを割り当てる場合などに役立ちます。必要なサイズが実行時にしか分からないデータ構造は、「アトミック」な方法で割り当てられ、そのメンバーは連続してパックされます。

同様の Rust の実装が (unsafe構成要素なしで) 可能かどうか、可能であればどのように見えるか疑問に思っています。たぶん、コンパイラは定義でライフタイム指定子を使用していくつかの情報を推測するかもしれませstructんか?

4

1 に答える 1

2

「柔軟な長さの配列」に関してはVec::with_capacity、差し迫った必要以上のものを割り当てるために使用できます。

let mut vec: Vec<int> = Vec::with_capacity(10);

// The vector contains no items, even though it has capacity for more
assert_eq!(vec.len(), 0);

// These are all done without reallocating...
for i in range(0i, 10) {
    vec.push(i);
}

// ...but this may make the vector reallocate
vec.push(11);

ただし、より一般的なケースでは、TypedArenaを使用することをお勧めします。

于 2014-12-19T20:19:11.627 に答える