Rust 会优化掉未使用的函数参数吗?
Will Rust optimize away unused function arguments?
我有一个函数类型
f: fn(x: SomeType, y: Arc<()>) -> ISupposeTheReturnTypeDoesNotMatter
编译时(有或没有优化),y
会被优化掉吗?
y
的目的是限制f
的运行个实例的数量,如果y
被引用太多次,[的调用者=14=] 不会调用 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();
}
这个看似棘手的解决方法的原因是我找不到满足我需要的库(使用一个不断变化的工作队列和有限数量的异步(tokio)工作者,如果工作失败则重新排队工作)
Will Rust optimize away unused function arguments?
是的,LLVM(rustc 的后端)能够在删除未使用的变量时优化掉它们不会改变程序行为,尽管没有任何保证它会这样做。 rustc 在 LLVM 之前也有一些通过,但同样适用。
了解什么才是程序行为是一件棘手的事情。但是,引用计数机制中使用的 multi-threaded 基元通常是那种无法出于充分理由优化掉的东西。请参阅 Rust 参考以获取更多信息(其他可能有帮助的资源是 nomicon、不同的 GitHub 存储库、Rust 论坛、Rust 使用的 C++11 内存模型等)。
另一方面,如果您问的是遇到未使用参数时语言的语义是什么,那么不,Rust 不会忽略它们(希望永远不会!)。
will the y
be optimized away?
不是,是有副作用的类型。例如,删除它需要 运行 non-trivial 代码。
The intention of the y
is to limit the number of the running instances of f
这样的安排不限制有多少个线程 运行 f
因为 Arc
不是互斥锁,即使它是某种互斥锁,您也可以构造为许多独立的,如你所愿。
我有一个函数类型
f: fn(x: SomeType, y: Arc<()>) -> ISupposeTheReturnTypeDoesNotMatter
编译时(有或没有优化),y
会被优化掉吗?
y
的目的是限制f
的运行个实例的数量,如果y
被引用太多次,[的调用者=14=] 不会调用 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();
}
这个看似棘手的解决方法的原因是我找不到满足我需要的库(使用一个不断变化的工作队列和有限数量的异步(tokio)工作者,如果工作失败则重新排队工作)
Will Rust optimize away unused function arguments?
是的,LLVM(rustc 的后端)能够在删除未使用的变量时优化掉它们不会改变程序行为,尽管没有任何保证它会这样做。 rustc 在 LLVM 之前也有一些通过,但同样适用。
了解什么才是程序行为是一件棘手的事情。但是,引用计数机制中使用的 multi-threaded 基元通常是那种无法出于充分理由优化掉的东西。请参阅 Rust 参考以获取更多信息(其他可能有帮助的资源是 nomicon、不同的 GitHub 存储库、Rust 论坛、Rust 使用的 C++11 内存模型等)。
另一方面,如果您问的是遇到未使用参数时语言的语义是什么,那么不,Rust 不会忽略它们(希望永远不会!)。
will the
y
be optimized away?
不是,是有副作用的类型。例如,删除它需要 运行 non-trivial 代码。
The intention of the
y
is to limit the number of the running instances off
这样的安排不限制有多少个线程 运行 f
因为 Arc
不是互斥锁,即使它是某种互斥锁,您也可以构造为许多独立的,如你所愿。