相关疑难解决方法(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万
查看次数

我可以对我自己的非指针类型使用"空指针优化"吗?

当你有一个时Option<&T>,编译器就知道它NULL永远不是一个可能的值&T,而是None变量编码为NULL.这样可以节省空间:

use std::mem;

fn main() {
    assert_eq!(mem::size_of::<&u8>(), mem::size_of::<Option<&u8>>());
}
Run Code Online (Sandbox Code Playgroud)

但是,如果使用非指针类型执行相同操作,则不会有额外的位来存储该值,并且需要额外的空间:

use std::mem;

fn main() {
    // fails because left is 1 and right is 2
    assert_eq!(mem::size_of::<u8>(), mem::size_of::<Option<u8>>()); 
}
Run Code Online (Sandbox Code Playgroud)

一般来说,这是正确的.但是,我想选择加入优化,因为我知道我的类型有某些不可能的值.作为一个例子,我可能有一个有年龄的玩家角色.年龄可能未知,但永远不会高255:

struct Age(u8);

struct Player {
    age: Option<Age>,
}
Run Code Online (Sandbox Code Playgroud)

我希望能够通知优化器这个约束 - Age永远不会255,因此使用该位模式是安全的None.这可能吗?

optimization rust

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

如何检查从C传递的函数指针是否为非NULL

示例代码如下

Rust部分:

#[no_mangle]
pub extern fn call_c_function(value: i32, fun: fn(i32) -> i32) -> i32 {
    fun(value)
}
Run Code Online (Sandbox Code Playgroud)

而C部分:

int32_t call_c_function(int32_t value, int32_t (*fun)(int32_t));

int32_t triple(int32_t x)
{
    return x*3;
}

int main(int argc, char *argv[])
{
    int32_t value = 3;
    int32_t result = call_c_function(value, triple);

    printf("%d tripled is %d\n", value, result);

    call_c_function(0, NULL);  // Crash here

    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

当然第二次召唤call_c_function会崩溃.Rust编译器不会抱怨里面的不安全代码call_c_function,因为从生锈的角度来看这段代码是安全的.也不允许简单地写:

if !fun.is_null() {
    fun(value)
}
Run Code Online (Sandbox Code Playgroud)

因为fun类型是fn(i32) -> i32(它不是指针).

所以我的问题是,如何call_c_function防止NULL指针解除引用?有没有办法检查从C传递的回调是否无效?

也许我必须改变 …

c ffi rust

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

标签 统计

rust ×3

c ×1

ffi ×1

null-pointer ×1

optimization ×1

performance ×1