如何在Rust中执行有效的向量初始化



在Rust中填充结构体向量的好方法是什么:

  • 大小是动态的,但在初始化时是已知的。
  • 不首先将内存初始化为虚拟值。
  • 不重新分配内存。
  • 在本例中,vector的所有成员总是初始化。
    (与rust没有未定义行为的保证保持一致)。

和理想

  • 不检查每个索引访问
    (因为在声明vector时已知大小,这应该是可能的)。
  • 不需要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代码,在一个简单的循环中填充数组,所以我想知道是否有一个质朴的方法来执行这样一个常见的任务,零或至少最小的开销?

如果这段代码的Rust版本通常需要一些额外的检查,最接近的等效是什么?

只用mapcollect

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

"初始化"在安全的Rust中没有意义,因为你需要能够访问未初始化的值,这是不安全的。Iterator::size_hint方法可以在收集到容器中时使用,以确保进行最小数量的分配。

基本上,我相信优化器会在这里做正确的事情。如果它不这样做,我相信它最终会。

最新更新