【发布时间】:2021-07-30 21:36:14
【问题描述】:
在编写相对实时的代码时,通常会避免主执行循环中的堆分配。因此,根据我的经验,您在初始化步骤中分配程序所需的所有内存,然后根据需要传递内存。 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)。
标签: rust