Rust是否会优化掉未使用的函数参数?

问题描述

我有类型的函数

f: fn(x: SomeType,y: Arc<()>) -> ISupposeTheReturnTypeDoesNotMatter

编译后(有或没有优化),y会被优化掉吗?

y的目的是限制f的运行实例的数量,如果y被多次引用,f调用者将不会调用f直到y的引用计数变低。

编辑:澄清我的意图

目的是控制运行中的http请求的数量(由上面的f表示),伪代码如下所示:

let y = Arc::new(());
let all_jobs_to_be_done = vector_of_many_jobs;
loop {
    while y.strong_count() < some_predefined_limit {
        // we have some free slots,fill them up with instances of f,// f is passed with a clone of y,// so that the running of f would increase the ref count,// and the death of the worker thread would decrease the ref count
        let work = all_jobs_to_be_done.pop();
        let ticket = y.clone();
        spawn_work(move || {f(work,ticket)});
    }

    sleep_for_a_few_seconds();
}

进行这种看上去很棘手的工作的原因是,我找不到满足我的需求的库(使用一个数量有限的异步(东京)工作人员来更改工作队列,并在工作失败时重新排队该工作)

解决方法

Rust是否会优化掉未使用的函数参数?

是的,LLVM(rustc的后端)能够在删除未使用的变量时优化掉未使用的变量,但不会改变程序的行为,尽管没有任何保证可以做到。 rustc在LLVM之前也有一些通过,但是同样适用。

知道什么才算是程序行为是一件棘手的事情。但是,重新计数机制中使用的多线程基元通常是由于充分的原因而无法优化的事情。请参阅Rust参考以获取更多信息(其他可能有用的资源包括nomicon,不同的GitHub存储库,Rust论坛,Rust使用的C ++ 11内存模型等)。

另一方面,如果您询问语言遇到未使用的参数时的语义是什么,那么不会,Rust不会忽略它们(希望永远不会!)。

y会被优化吗?

不,这是一种有副作用的类型。例如,删除它需要运行简单的代码。

y的目的是限制f的运行实例数

由于f不是互斥量,因此这种安排并不限制正在运行的线程数Arc,即使它是某种互斥量,也可以根据需要构造尽可能多的独立线程。