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

Inc*_*ete 5 compiler-optimization rust

我有一个类型的函数

f: fn(x: SomeType, y: Arc<()>) -> ISupposeTheReturnTypeDoesNotMatter
Run Code Online (Sandbox Code Playgroud)

编译时(有或没有优化),会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();
}
Run Code Online (Sandbox Code Playgroud)

这种看似笨拙的解决方法的原因是我找不到满足我需求的库(消耗具有有限数量的异步(tokio)工作者的不断变化的工作队列,如果工作失败,则重新排队工作)

Aco*_*orn 6

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

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

知道什么才算作程序行为是一件棘手的事情。然而,引用计数机制中使用的多线程原语通常是那种不能被优化掉的东西,有充分的理由。有关更多信息,请参阅 Rust 参考(其他可能有帮助的资源包括 nomicon、不同的 GitHub 存储库、Rust 论坛、Rust 使用的 C++11 内存模型等)。

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

y被优化掉吗?

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

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

这种安排不限制正在运行的线程数,f因为Arc它不是互斥锁,即使它是某种互斥锁,您也可以根据需要构造任意数量的独立线程。

  • @Masklinn 对名为“clone”的函数的调用被删除,但 Arc 的克隆(作为一个概念)*未*删除,“lock add”和“lock sub”指令出现在优化输出中。在OP问题的背景下,由于这个答案中解释的原因,这个论点没有被优化掉。 (2认同)