在其所有权范例的印象下,我才开始使用Rust。读tutorial,发现以下代码
let secret_number = rand::thread_rng().gen_range(1, 101);
我假设在通过实例化rand::ThreadRng
结构的方法后生成了一个随机整数。
仅使用C语言中的函数是否对性能更好?由于Rust将自己定位为一种系统编程语言,并且如果我猜对了,那么选择创建结构并使用其方法的选择似乎不是最佳选择。
答案 0 :(得分:5)
与[...] C相比,Rust风格的方法调用方法是否有开销?
否。
两种语言都可以生成完全相同的机器指令。表达这些概念的语法并不要求结果代码效率低下(在许多情况下相反)。
仅使用C语言中的函数对性能是否更好?
方法是功能。
Rust方法在概念上与使用指针的C函数相同:
铁锈
struct Foo {
a: i32,
}
impl Foo {
fn add(&self, b: i32) -> i32 {
self.a + b
}
}
C
struct Foo {
int a;
};
int Foo_add(struct Foo *self, int b) {
return self->a + b;
}
这两种语言之间没有重要区别。
Rust具有 free 功能和 associated 功能;如果您不需要引用数据,则无需:
铁锈
struct Foo {
a: i32,
}
// Free function
fn foo() -> Foo {
Foo { a: 42 }
}
impl Foo {
// Associated function
fn new() -> Foo {
Foo { a: 99 }
}
}
C
struct Foo {
int a;
};
struct Foo foo() {
struct Foo foo = { 42 };
return foo;
}
struct Foo Foo_new() {
struct Foo foo = { 99 };
return foo;
}
Rust也具有大小为零的类型,看起来它们具有关联的数据,但是在已编译的代码中消失了:
铁锈
// Zero size
struct Foo;
impl Foo {
fn add_one(&self, b: i32) -> i32 {
b + 1
}
}
C
int Foo_add_one(int b) {
return b + 1;
}
创建结构并使用其方法似乎不是很理想
在C代码中常见创建结构和使用相关方法。我会说这很可能是主要编码风格。我不知道为什么你会说它不是最理想的。
您的示例案例没有用做比较,因为您没有提供任何 C代码,更不用说等效的代码了。 ThreadRng
做了很多工作,为生成随机数提供了更好的体验:
ThreadRng
使用ReseedingRng
包装与StdRng
相同的PRNG,在生成32 MiB随机数据后重新播种。每个线程缓存一个实例,并且返回的ThreadRng
是对此实例的引用-因此ThreadRng
既不是Send
也不是Sync
,但是可以在单个线程中使用。根据需要,通过EntropyRng
播种并重新播种该RNG。
“传统”随机数生成器(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);
}
请注意,它仍使用指向数据的指针。