Header files 什么';它不在接口文件中吗?

Header files 什么';它不在接口文件中吗?,header-files,compilation,d,Header Files,Compilation,D,我的印象是,对我来说,这就转化为签名——只返回类型、名称和参数,这样编译器就知道它是有效的,链接器以后就可以做这些脏活了 但是,通过dmd运行文件几乎不会删除任何内容: import std.stdio; void SayHello(const string Name) { writeln("Hello, ", Name, "!"); } 几乎不是优化的典范 接口文件中到底剥离了什么 (因为这是我能找到的最接近的东西而加上。) 几乎不是优化的典范 不,那是一种优化。如果实现足够小

我的印象是,对我来说,这就转化为签名——只返回类型、名称和参数,这样编译器就知道它是有效的,链接器以后就可以做这些脏活了

但是,通过
dmd
运行文件几乎不会删除任何内容:

import std.stdio;

void SayHello(const string Name)
{
    writeln("Hello, ", Name, "!");
}

几乎不是优化的典范

接口文件中到底剥离了什么

(因为这是我能找到的最接近的东西而加上。)

几乎不是优化的典范


不,那是一种优化。如果实现足够小,以后可以内联,编译器将把实现留在接口文件中。

任何要内联的函数都必须在.di文件中有完整的源代码。任何将在CTFE中使用的函数不仅必须在.di文件中有其完整的源代码,而且它使用的每个函数的完整源代码(直接或间接)必须可供编译器使用。此外,由于模板的工作方式,它们的完整源代码也必须在.di文件中(这与C++中模板必须在头文件中的方式相同)。因此,在很多情况下,需要将内容保存在.di文件中


我不知道编译器究竟在什么情况下选择剥离内容(除了模板会自动全部包含在.di文件中,因为它们必须这样做)。它可能会根据编译器的当前实现及其所做的优化而改变。但至少,如果要做任何内联,它必须留在小的函数体中。然而,大型函数体和小型虚拟函数体(无论如何都不能内联)很可能会被剥离。但您的示例给出了一个小的非虚拟函数,因此dmd可能保留了它,以便它可以内联任何对它的调用。如果您想在生成.di文件时看到dmd剥离了大量内容,那么您可能需要具有大型函数和/或使用类。

我经常想知道,如果要使.di文件成为二进制格式,并具有源文件的序列化副本,并且大部分工作已经完成:mmap in,在正确的符号表中插入一个指向它的指针,完成。@BCS
.di
文件实际上不是标准的一部分,因此没有任何政治因素来阻止这个想法。我想知道他们为什么没有做这件事!
dmd Interface.d -o- -H
// D import file generated from 'Interface.d'
import std.stdio;
void SayHello(const string Name)
{
writeln("Hello, ",Name,"!");
}