Что НЕ в файле интерфейса? - PullRequest
       67

Что НЕ в файле интерфейса?

6 голосов
/ 11 октября 2011

У меня сложилось впечатление, что "Файл интерфейса AD содержит только то, что нужно для импорта модуля, а не вся реализация этого модуля." Для меня это означает, что подписи - просто возвращаемые типы , имена и аргументы, чтобы компилятор знал, что он действителен, а компоновщик может выполнить грязную работу позже.

Запуск файла через 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,"!");
}

Едва ли это образец оптимизации.

Что именно выделяется в интерфейсных файлах?

( добавлено, потому что это самая близкая вещь, которую я мог найти.)

Ответы [ 2 ]

7 голосов
/ 11 октября 2011

Любая функция, которая будет встроена, должна иметь свой полный источник в файле .di.Любая функция, которая будет использоваться в CTFE, должна иметь не только полный исходный код в файле .di, но и полный источник каждой функции, которую она использует - прямо или косвенно - должна быть доступна компилятору.Кроме того, из-за того, как работают шаблоны, их полный источник также должен быть в файле .di (что аналогично тому, как шаблоны должны быть в заголовочных файлах в C ++).Итак, есть ряд случаев, когда вам нужно , что нужно , чтобы быть в файле .di.

При каких именно обстоятельствах компилятор решает удалить материал или нет, я не знаю(кроме того факта, что шаблоны автоматически заканчиваются в файлах .di полностью, потому что они имеют to).Это может измениться в зависимости от текущей реализации компилятора и его оптимизации.Но, как минимум, его придется оставить в небольших функциональных телах, если он собирается делать какие-либо встраивания.Большие функциональные тела и тела маленьких виртуальных функций (которые не могут быть встроены в любом случае), вероятно, будут удалены.Но ваш пример дает небольшую, не виртуальную функцию, поэтому dmd, вероятно, оставил ее, чтобы она могла встроить любые вызовы к ней.Если вы хотите, чтобы при создании файла .di dmd избавляло от множества проблем, вам, вероятно, понадобятся большие функции и / или классы.

4 голосов
/ 11 октября 2011

Едва ли это образец оптимизации.

Нет, - это оптимизация. Компилятор оставит реализацию в файле интерфейса, если реализация достаточно мала, чтобы впоследствии ее можно было встроить.

...