首页 文章

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

提问于
浏览
0

在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代码,它在一个简单的循环中填充一个数组,所以我想知道是否有一种乡村方式来执行这样一个零或至少最小开销的常见任务?

如果此代码的Rust版本通常需要一些额外的检查,那么最近的等价物是什么?

1 回答

  • 5

    只需使用 mapcollect .

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

    "Initializing"不要't make sense in safe Rust because you' d需要能够访问未初始化的值,这是不安全的 . 收集到容器中时可以使用Iterator::size_hint方法,以确保进行最少量的分配 .

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

相关问题