arrays - 更有效地初始化数组持有结构

标签 arrays for-loop struct rust

我有以下代码:

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/

相关文章:

javascript - 为什么 Array.filter() 方法不只适用于箭头函数,而不是 Javascript 中的传统函数?

c - 根据类型区分结构

java - 从 String 转换为 byte[] 时遇到问题

c++ - 返回带有指针 C++ 的数组

ruby-on-rails - Rails 4 字符串复选框从不返回空数组

c - for 循环在 C 中不能正确递增

C# 在另一个函数中打破其他函数循环

c++ - for循环的效率

c - snprintf 和字符串数组语法

go - 从字符串列表初始化结构