【问题标题】:Rust - can I ask/force compiler to do monomorphization code generation while compiling a crate (instead of postponing it to the caller crate )Rust - 我可以在编译 crate 时要求/强制编译器生成单态代码(而不是将其推迟到调用方 crate )
【发布时间】:2022-11-01 13:07:13
【问题描述】:

我有一个使用货物工作区构建的项目,其中包括很多板条箱。

较低级别的 crate 之一包含通用数据结构,其中涉及大量 serde 代码。

为了减少编译时间,我尝试在编译层次结构中较低的板条箱中使用数据结构上的单态实例创建对象,并使用更高级别的板条箱中的对象。我的目标是只编译一次较低级别的 crate,然后在较高级别的 crate 上工作——而不是每次都生成单态实例。

例子:

lower-level crate
----------------- 

pub struct MyCache<T> {
    //generic implementation of cache  
}  

pub struct MyCacheString {
    cache: MyCache<String> 
} 

higher-level crate
------------------
use MyCacheString; 

但问题是编译器在更高级别的 crate 中生成了该单态性(根据“cargo llvm-lines”)

有没有办法在编译较低级别的 crate 时要求/强制编译器生成单一化代码?

【问题讨论】:

  • 你确定这对你有帮助吗?我假设您想减少编译时间。您是否查看了cargo --timings 的输出并意识到这确实会加快速度?
  • 好吧,我不确定 - 但根据 cargo llvm-line 在更高级别的 crate 中大约有 300,000 行由 serde 代码生成,可能由该数据结构的多个实例生成(根据 cargo --timing 这个更高level crate 绝对是编译的瓶颈)

标签: rust compile-time monomorphism


【解决方案1】:

好的,根据rustc_monomorphize::collector docstring:

惰性模式意味着只有在实际引用时才会实例化项目

因此,为了使编译器对低级板条箱中的代码进行单态化,我需要从公共非泛型函数低级板条箱中调用对象函数。 (不知道为什么 - 但它不适用于异步功能)。

(如果有人知道告诉编译器使用“急切模式”的宏,那就更好了)

【讨论】:

    猜你喜欢
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多