在Rust中,引用永远不能为null,因此如果您实际需要null,例如链接列表,则使用以下Option类型:
struct Element {
value: i32,
next: Option<Box<Element>>,
}
Run Code Online (Sandbox Code Playgroud)
与简单指针相比,在内存分配和解除引用步骤方面涉及多少开销?在编译器/运行时中是否存在一些"魔力",使得使用相同的构造或通过将指针包装在向量中,使用自己在非核心库中Option实现成本,或者成本更低?Optionenum
我的理解是,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中,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) 我有这个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_rust为Foo_C然后仅将指针传递Foo_C给f?
我正在尝试将一些旧的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?我的问题是,虽然我可能得到我想要的功能,但我不确定如何获得(大致)相同的速度.
这部分代码是我们代码中的主要瓶颈(至少这部分代码),并且在翻译时它希望保留以下属性.
asize它可能非常大.firstEdge并firstEdgeRight在同一时间大致找到.因此,只有一个循环而不是两个循环是一件好事 - 为了避免再次从头开始搜索(即使我认为这个解决方案会杀死预取器(但我不确定,也许旧机器运行代码)甚至没有预取器)).虽然性能很重要,但可读性当然更为重要:)
编辑好的,这是我可能实现的Rust(cond_right()并且cond_left()被遗漏了).我想到的是:
first_edge和first_edge_right变异吗?它们在我的实现中,但我感觉不对,因为它们只被分配一次.let mut …Run Code Online (Sandbox Code Playgroud)