为什么 std::fs::write(...) 使用内部函数?

Why does std::fs::write(...) use an inner function?

我是 Rust 的新手,仔细查看了源代码,发现了这个:

#[stable(feature = "fs_read_write_bytes", since = "1.26.0")]
pub fn write<P: AsRef<Path>, C: AsRef<[u8]>>(path: P, contents: C) -> io::Result<()> {
    fn inner(path: &Path, contents: &[u8]) -> io::Result<()> {
        File::create(path)?.write_all(contents)
    }
    inner(path.as_ref(), contents.as_ref())
}

这个函数定义这样的内部函数有什么原因吗?为什么不直接写:

File::create(path.as_ref())?.write_all(contents.as_ref())

单态化成本。

write(),与 Rust 中的大多数文件系统函数一样,为方便起见,采用 AsRef<Path> 而不是 Path(以允许您传递例如 &str)。但这也有代价:这意味着函数将针对每种类型单独进行单态化和优化,而实际上并没有这样做的必要。虽然 LLVM 很可能会删除所有这些实例的重复数据,但用于优化它们的时间仍然浪费在编译时间上。

为了减轻这种成本,它调用了一个内部的 non-generic 函数来完成所有繁重的工作。外部函数仅包含 necessarily-generic 代码 - 转换为 Path.