我的印象是"A D interface file contains only what an import of the module needs, rather than the whole implementation of that module."对我来说,转换为签名 - 只返回类型,名称和参数,以便编译器知道它是有效的,链接器可以在以后执行脏工作。
通过dmd
运行文件,几乎没有删除任何内容:
import std.stdio;
void SayHello(const string Name)
{
writeln("Hello, ", Name, "!");
}
dmd Interface.d -o- -H
// D import file generated from 'Interface.d'
import std.stdio;
void SayHello(const string Name)
{
writeln("Hello, ",Name,"!");
}
几乎不是优化的典范。
究竟是什么在接口文件中被剥离了?
(header-files添加了,因为它是我能找到的最接近的东西。)
答案 0 :(得分:7)
任何要内联的函数都必须在.di文件中包含完整的源代码。任何将在CTFE中使用的函数不仅必须在.di文件中具有完整的源,而且它所使用的每个函数的完整源 - 直接或间接 - 必须可供编译器使用。此外,由于模板的工作方式,它们的完整源也必须位于.di文件中(这与模板在C ++中的头文件中的方式相同)。因此,在许多情况下,您需要的东西都在.di文件中。
在编译器选择是否剥离内容的情况下,我不知道(除了模板自动完全以.di文件结尾的事实,因为他们有) 。它可能会根据编译器的当前实现以及它的优化程度而改变。但至少,如果要进行任何内联,它将不得不离开小功能机构。然而,大型功能体和小型虚拟功能体(无论如何都无法内联)可能会被剥离。但是你的例子给出了一个小的非虚函数,所以dmd可能会把它留在里面,以便它可以内联任何调用它。如果你想在生成.di文件时看到dmd剥离很多东西,那么你可能需要使用大型函数和/或使用类。
答案 1 :(得分:4)
几乎不是优化的典范。
不,是优化。如果实现足够小,以后可以内联,编译器会将实现留在接口文件中。