簡體   English   中英

如何在Rust中執行有效的矢量初始化?

[英]How to perform efficient vector initialization in Rust?

在Rust中填充結構向量的好方法是:

  • 大小是動態的,但在初始化時已知。
  • 首先不將內存初始化為虛擬值。
  • 不會按已填滿的方式重新分配內存。
  • 在這個例子中,向量的所有成員總是被初始化。
    (與Rusts保證沒有未定義的行為一致)。

理想地

  • 不索引檢查每個索引訪問
    (由於在聲明向量時已知大小,因此應該可以)。
  • 不需要unsafe
    (不確定這是否合理,但是編譯器_could_會檢測到所有值始終都被填充,從而在不安全的塊中允許這種邏輯)。

C等效項是:

struct MyStruct *create_mystruct(const uint n) {
    struct MyStruct *vector = malloc(sizeof(*vector) * n);
    for (uint i = 0; i < n; i++) {
        /* any kind of initialization */
        initialize_mystruct(&vector[i], i);
    }
    return vector;
}

我正在移植一些在一個簡單循環中填充數組的C代碼,所以我想知道是否有一種Rustic方式可以以零或至少最小的開銷執行這樣的常見任務?

如果此代碼的Rust版本通常需要進行一些額外的檢查,那么最接近的等效項是什么?

只需使用mapcollect

struct MyStruct(usize);

fn create_mystructs(n: usize) -> Vec<MyStruct> {
    (0..n).map(MyStruct).collect()
}

在安全的Rust中,“初始化”沒有意義,因為您需要具有訪問未初始化值的能力,這是不安全的。 在收集到容器中時,可以使用Iterator::size_hint方法來確保分配的數量最少。

基本上,我相信優化器會在這里做正確的事情。 如果沒有,我相信最終會的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM