与其他系统编程语言(例如C)中通常使用的功能相比,Rust样式的方法调用方法是否有开销?

And*_*nin 0 performance systems-programming rust

在其所有权范例的印象下,我才开始使用Rust。阅读该教程,我发现以下代码

let secret_number = rand::thread_rng().gen_range(1, 101);
Run Code Online (Sandbox Code Playgroud)

我假设rand::ThreadRng通过调用结构的方法实例化结构后会生成一个随机整数。

仅使用C语言中的函数来提高性能是否更好?由于Rust将自己定位为系统编程语言,并且如果我猜对了,那么选择创建结构并使用其方法的选择似乎不是最佳选择。

She*_*ter 5

与C相比,Rust风格的方法调用方法是否有开销?

没有。

两种语言都可以生成完全相同的机器指令。表达这些概念的语法并不要求结果代码效率低下(在许多情况下相反)。

仅使用C语言中的函数来提高性能是否更好?

方法就是功能。

Rust方法在概念上与使用指针的C函数相同:

struct Foo {
    a: i32,
}

impl Foo {
    fn add(&self, b: i32) -> i32 {
        self.a + b
    }
}
Run Code Online (Sandbox Code Playgroud)

C

struct Foo {
    int a;
};

int Foo_add(struct Foo *self, int b) {
    return self->a + b;
}
Run Code Online (Sandbox Code Playgroud)

这两种语言之间没有重要区别。

Rust具有免费功能和相关功能;如果您不需要引用数据,则无需:

struct Foo {
    a: i32,
}

// Free function
fn foo() -> Foo { 
    Foo { a: 42 }
}

impl Foo {
    // Associated function
    fn new() -> Foo {
        Foo { a: 99 }
    }
}
Run Code Online (Sandbox Code Playgroud)

C

struct Foo {
    int a;
};

struct Foo foo() {
    struct Foo foo = { 42 };
    return foo;
}

struct Foo Foo_new() {
    struct Foo foo = { 99 };
    return foo;
}
Run Code Online (Sandbox Code Playgroud)

Rust还具有零大小的类型,看起来像它们具有关联的数据,但是在编译后的代码中消失了:

// Zero size
struct Foo;

impl Foo {
    fn add_one(&self, b: i32) -> i32 {
        b + 1
    }
}
Run Code Online (Sandbox Code Playgroud)

C

int Foo_add_one(int b) {
    return b + 1;
}
Run Code Online (Sandbox Code Playgroud)

创建结构并使用其方法似乎不太理想

创建结构和使用相关方法在C代码中很常见。我会说这很可能是主要的编码风格。我不知道为什么你会说它不是最理想的。


您的示例案例没有用做比较,因为您没有提供任何 C代码,更不用说等效的代码了。ThreadRng了很多工作来提供用于生成随机数了更好的体验:

ThreadRng使用ReseedingRng包装与相同的PRNG StdRng,在生成32 MiB随机数据后重新播种。每个线程都会缓存一个实例,并且返回的ThreadRng是对该实例的引用-因此,在单个线程中使用ThreadRng它既不是Send也不Sync安全。该RNG可以EntropyRng根据需要播种和重新播种。

“传统的”随机数生成器(rand)具有全局状态(通常是一件坏事),但从概念上讲看起来像这样:

struct RngState {
    int whatever_goes_here;
};

static struct RngState GLOBAL_STATE = { 0 };

int rand_with_state(struct RngState *state) {
    return state->whatever_goes_here++;
}

int rand() {
    return rand_with_state(&GLOBAL_STATE);
}
Run Code Online (Sandbox Code Playgroud)

注意,它仍然使用指向数据的指针