我有以下代码:
const N: usize = 10000;
const S: usize = 7000;
#[derive(Copy, Clone, Debug)]
struct T {
a: f64,
b: f64,
f: f64
}
fn main() {
let mut t: [T; N] = [T {a: 0.0, b: 0.0, f: 0.0}; N];
for i in 0..N {
t[i].a = 0.0;
t[i].b = 1.0;
t[i].f = i as f64 * 0.25;
}
for _ in 0..S {
for i in 0..N {
t[i].a += t[i].b * t[i].f;
t[i].b -= t[i].a * t[i].f;
}
println!("{}", t[1].a);
}
}
我不确定为什么必须以这种方式初始化数组 t
。第一个 for 循环旨在将包含结构的数组初始化为其各自的值。
当我尝试直接用数组省略初始化时:
let mut t: [T; N];
我收到以下错误:
error[E0381]: use of possibly uninitialized variable: t
所有的 for 循环都是这样的,我只是想知道是否有更聪明的数组方法,它是用第一个 for 循环初始化的。
最佳答案
I'm unsure why the array
t
must be initialized that way.
因为 Rust 不允许您接触(全部或部分)未初始化的值。编译器不够聪明,无法证明循环肯定会初始化所有内容,所以它只是禁止它。
现在,优化器是另一回事了。 可以注意到初始化是多余的并跳过它……理论上。该代码和当前的编译器似乎没有这样做。这就是优化。
I just want to know if there is a smarter way for the array and it's initialization with the first for-loop.
聪明的方法是让代码保持原样。从统计学上讲,这不太可能成为瓶颈。如果分析表明它 是一个瓶颈,那么您可以使用 uninitialised
.但是,请注意,如果使用不当,这样做可能会导致未定义的行为。虽然不是详尽的列表,但您一定要避免在任何不是 Copy
的类型上使用它。
如果您确实需要使用它,我强烈建议您也调整第一个循环,以防止忘记初始化元素或结构中的字段:
let mut t: [T; N] = unsafe { ::std::mem::uninitialized() };
for (i, e) in t.iter_mut().enumerate() {
*e = T {
a: 0.0,
b: 1.0,
f: i as f64 * 0.25,
}
}
关于arrays - 更有效地初始化数组持有结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44182269/