相关疑难解决方法(0)

Rust的Option类型的开销是多少?

在Rust中,引用永远不能为null,因此如果您实际需要null,例如链接列表,则使用以下Option类型:

struct Element {
    value: i32,
    next: Option<Box<Element>>,
}
Run Code Online (Sandbox Code Playgroud)

与简单指针相比,在内存分配和解除引用步骤方面涉及多少开销?在编译器/运行时中是否存在一些"魔力",使得使用相同的构造或通过将指针包装在向量中,使用自己在非核心库中Option实现成本,或者成本更低?Optionenum

performance null-pointer rust

72
推荐指数
1
解决办法
1万
查看次数

为什么枚举需要额外的内存大小?

我的理解是,enum就像union在C中一样,系统将在枚举中分配最大的数据类型.

enum E1 {
    DblVal1(f64),
}

enum E2 {
    DblVal1(f64),
    DblVal2(f64),
    DblVal3(f64),
    DblVal4(f64),
}

fn main() {
    println!("Size is {}", std::mem::size_of::<E1>());
    println!("Size is {}", std::mem::size_of::<E2>());
}
Run Code Online (Sandbox Code Playgroud)

为什么E1按预期占用8个字节,但E2占用16个字节?

rust

7
推荐指数
2
解决办法
2445
查看次数

在Rust中,Option是否编译为运行时检查或指令跳转?

在Rust中,Option定义为:

pub enum Option<T> {
    None,
    Some(T),
}
Run Code Online (Sandbox Code Playgroud)

像这样使用:

fn may_return_none() -> Option<i32> {
    if is_full_moon {
        None
    } else {
        Some(1)
    }
}

fn main() {
    let optional = may_return_none();
    match optional {
        None => println!("None"),
        Some(v) => println!("Some"),
    }
}
Run Code Online (Sandbox Code Playgroud)

我不熟悉Rust内部,但最初我认为它可能与Nullable.NET 类似,所以我上面的Rust代码的编译逻辑就像这样:

// occupies `sizeof(T) + 1` memory space, possibly more depending on `Bool`'s alignment, so `Nullable<Int32>` consumes 5 bytes.
struct Nullable<T> {
    Bool hasValue;
    T value;
}

Nullable<Int32> MayReturnNone() {
    if( isFullMoon ) …
Run Code Online (Sandbox Code Playgroud)

compiler-construction compiler-optimization rust

7
推荐指数
1
解决办法
464
查看次数

repr(C)类型如何处理Option?

我有这个C代码:

typedef void (*f_t)(int a);

struct Foo {
        f_t f;
};

extern void f(struct Foo *);
Run Code Online (Sandbox Code Playgroud)

bindgen生成以下Rust代码(我删除了不重要的细节):

#[repr(C)]
#[derive(Copy, Clone)]
#[derive(Debug)]
pub struct Foo {
    pub f: ::std::option::Option<extern "C" fn(a: ::std::os::raw::c_int)>,
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么Option在这里.显然Rust enum和C指针在位级别上是不一样的,所以Rust编译器如何处理这个?

当我调用C f函数并将指针传递给Rust结构时Foo,编译器是否转换Foo_rustFoo_C然后仅将指针传递Foo_Cf

rust

2
推荐指数
1
解决办法
563
查看次数

将性能关键循环从C转换为Rust

我正在尝试将一些旧的C代码重写为Rust - 我是新手.我遇到的一个反复出现的问题是C代码有很多这样的循环:

for (i = startIndex; i < asize; i++)   
{
    if (firstEdge < 0 && condLeft(i))
    {
        firstEdge = i;
    }

    RightIndex = asize-1-i;
    if (firstEdgeRight < 0 && condRight(RightIndex))
    {
        firstEdgeRight = RightIndex;
    }

    // Found both edges
    if (firstEdge >= 0 && firstEdgeRight >= 0) {
        break;  
    }
}
Run Code Online (Sandbox Code Playgroud)

你会如何以高效的方式将其转化为Rust?我的问题是,虽然我可能得到我想要的功能,但我不确定如何获得(大致)相同的速度.

这部分代码是我们代码中的主要瓶颈(至少这部分代码),并且在翻译时它希望保留以下属性.

  1. 循环应该尽快破坏,因为asize它可能非常大.
  2. 双方firstEdgefirstEdgeRight在同一时间大致找到.因此,只有一个循环而不是两个循环是一件好事 - 为了避免再次从头开始搜索(即使我认为这个解决方案会杀死预取器(但我不确定,也许旧机器运行代码)甚至没有预取器)).

虽然性能很重要,但可读性当然更为重要:)

编辑好的,这是我可能实现的Rust(cond_right()并且cond_left()被遗漏了).我想到的是:

  1. 这是否是其他人如果必须从头开始实施的话呢?
  2. 我真的需要制作first_edgefirst_edge_right变异吗?它们在我的实现中,但我感觉不对,因为它们只被分配一次.
let mut …
Run Code Online (Sandbox Code Playgroud)

c translate rust

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