当编写相对实时的代码时,通常避免在主执行循环中进行堆分配。因此,在我的经验中,您需要在初始化步骤中分配程序所需的所有内存,然后根据需要传递内存。以C语言为例,一个玩具示例可能如下所示:
#include <stdlib.h>
#define LEN 100
void not_realtime() {
int *v = malloc(LEN * sizeof *v);
for (int i = 0; i < LEN; i++) {
v[i] = 1;
}
free(v);
}
void realtime(int *v, int len) {
for (int i = 0; i < len; i++) {
v[i] = 1;
}
}
int main(int argc, char **argv) {
not_realtime();
int *v = malloc(LEN * sizeof *v);
realtime(v, LEN);
free(v);
}
我相信在Rust中大致等价的代码:
fn possibly_realtime() {
let mut v = vec![0; 100];
for i in 0..v.len() {
v[i] = 1;
}
}
fn realtime(v: &mut Vec<i32>) {
for i in 0..v.len() {
v[i] = 1;
}
}
fn main() {
possibly_realtime();
let mut v: Vec<i32> = vec![0; 100];
realtime(&mut v);
}
我想知道的是:Rust是否能够优化
possibly_realtime
,使得对v
的本地堆分配仅在第一次调用possibly_realtime
时发生,并在后续调用中重复使用?我猜不行,但也许有一些神奇的方法可以实现。
Rust
是一种语言,所以我们在谈论的是rustc
(唯一可用的编译器),更具体地说,是rustc
背后的LLVM后端(因为rustc
将优化委托给LLVM)。 - Matthieu M.