#size #monomorphization #monomorphizing #share-generics #code-bloat

mono-macro

通过在具有 share-generics 的函数上强制单态化,以最小化二进制大小

4个版本

0.1.3 2023年8月8日
0.1.2 2023年8月8日
0.1.1 2022年3月7日
0.1.0 2022年3月6日

过程宏 中排名第 365

MIT/Apache

10KB
103

单态宏

此crate提供了 #[mono] 宏,用于强制泛型函数使用给定类型进行单态化。

搭配rustc中的 share-generics 模式,这可以导致更少的代码,详情见 https://github.com/rust-lang/rust/pull/48779

[dependencies]
mono-macro = "0.1"

用法

由于我们是自行单态化,您需要手动指定静态调度

在裸函数的情况下,

#[mono(T = i32, U = i64)]
fn func<T, U>(t: T, u: U) {
    ...
}

它将被展开为

pub const _: *const () = (&foo::<i32, i64>) as *const _ as _;
fn func<T, U>(t: T, u: U) {
    ...
}

对于更复杂的情况,请使用 mono_macro! 代替

trait Tr<T> {
    fn foo(&self, _t: T) {}
}

struct Foo<'a> {
    t: &'a str,
}

impl<'a, T> Tr<T> for Foo<'a> {
    fn foo(&self, _t: T) {}
}

mono_macro!(<Foo<'static> as Tr<i32>>::foo);

这将展开为

trait Tr<T> {
    fn foo(&self, _t: T) {}
}

struct Foo<'a> {
    t: &'a str,
}

impl<'a, T> Tr<T> for Foo<'a> {
    fn foo(&self, _t: T) {}
}

pub const _: *const () = (&<Foo<'static> as Tr<i32>>::foo) as *const _ as _;

许可证

根据您的选择,在Apache License,Version 2.0或MIT许可证下许可。 Apache License, Version 2.0MIT license
除非您明确表示否则,根据Apache-2.0许可证的定义,您提交的任何有意包含在此crate中的贡献,将根据上述条款双许可,不附加任何其他条款或条件。

依赖关系

~1.5MB
~35K SLoC