在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版本通常需要一些额外的检查,最接近的等效是什么?
只用map
和collect
。
struct MyStruct(usize);
fn create_mystructs(n: usize) -> Vec<MyStruct> {
(0..n).map(MyStruct).collect()
}
"初始化"在安全的Rust中没有意义,因为你需要能够访问未初始化的值,这是不安全的。Iterator::size_hint
方法可以在收集到容器中时使用,以确保进行最小数量的分配。
基本上,我相信优化器会在这里做正确的事情。如果它不这样做,我相信它最终会。