相关疑难解决方法(0)

使用非复制类型初始化大型固定大小的数组

我正在尝试初始化一些可以为空的非可复制类型的固定大小的数组,就像Option<Box<Thing>>某种类型的那样Thing.我想把它们中的两个打包成一个没有任何额外间接的结构.我想写这样的东西:

let array: [Option<Box<Thing>>; SIZE] = [None; SIZE];
Run Code Online (Sandbox Code Playgroud)

但它不起作用,因为[e; n]语法要求e实现Copy.当然,我可以将它扩展为SIZE Nones,但是当SIZE它很大时,这可能是笨重的.我不相信这可以用没有非自然编码的宏来完成SIZE.有没有好办法呢?

是的,这很容易unsafe; 没有办法unsafe吗?

rust

17
推荐指数
4
解决办法
2684
查看次数

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

在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;
}
Run Code Online (Sandbox Code Playgroud)

我正在移植一些C代码,它在一个简单的循环中填充一个数组,所以我想知道是否有一种乡村方式来执行这样一个零或至少最小开销的常见任务?

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

arrays performance unsafe rust

0
推荐指数
1
解决办法
1069
查看次数

标签 统计

rust ×2

arrays ×1

performance ×1

unsafe ×1