#[派生(PartialEq, Eq)]增加代码大小吗?



我向derive-builder提交了一个补丁,因为我需要能够测试生成的失败。这个补丁启用了EqPartialEq,所以我可以使用assert_eq!()测试失败。

问题是,

我的理解是生成不必要的trait实现会增加代码大小。

我的理解是,不使用的实现不生成更多的代码?这两个哪个是正确的?

为了验证这个理论,我生成了一个简单的二进制文件

#[derive(Debug)]
struct Foo {
id: i64
}
fn main() {
let a = Foo { id: 42 }; => Foo
println!("Hello, world! [{} {:?}]", a.id, a);
}

然后我用#[derive(Debug, PartialEq, Eq)]做了同样的生成。在这种情况下,我发现两者生成了相同的哈希;他们是一样的。不内容,我还尝试创建一个库并与--release编译。同样的事情。这一次只有struct Foo(没有main)。在这种情况下,我确实观察到了不同之处,这里是细微差别:

  • 在两次运行之间rlib (rust库)文件的大小不同。
  • rlibar韭菜。对我来说,它有三个文件,其中一个以cgu.0.rcgu.o结尾,另一个以cgu.1.rcgu.o结尾,还有一个文件是lib.rmeta
  • 在归档文件中,*.o文件是完全相同的(哈希)。
  • lib.rmeta文件在派生EqPartialEq的库中较大。

关于rmeta的优点,Rust文档是这样说的,

rmeta文件是包含crate元数据的自定义二进制格式。此文件可用于快速"检查"。通过跳过所有代码生成(如货物检查所做的那样),为文档收集足够的信息(如货物文档所做的那样)或用于流水线来实现项目。如果使用了——emit=metadata CLI选项,就会创建这个文件。rmeta文件不支持链接,因为它们不包含编译的目标文件。

所以看起来某个东西变大了,但是这个东西只是用于加工。

我在有和没有pub的库中尝试了上述测试。我认为,如果生成了一个没有使用的函数,那么至少会导致一个.o文件变大。我没能观察到这一点。