2011-10-11 2 views
6

나는 영향을 받았다. "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,"!"); 
} 

단단하게 모범을.

인터페이스 파일에서 정확히 무엇이 제거 되었습니까?

(그것은 내가 찾을 수있는 가장 가까운 일이기 때문에 덧붙였다.)

+1

대부분의 작업이 이미 완료된 상태에서 .di 파일을 소스의 직렬화 된 복사본으로 만드는 것이 무엇인지 궁금해했습니다. mmap in, 올바른 심볼 테이블에 포인터 삽입 , 끝났어. – BCS

+0

@BCS'.di' 파일은 실제로 표준의 일부가 아니므로 그 아이디어를 얻는 정치는 없습니다. 나는 왜 그들이 그것을하지 않은지 궁금해! – Maxpm

답변

7

인라인 될 모든 기능의 전체 소스는 .di 파일에 있어야합니다. CTFE에서 사용될 모든 함수는 .di 파일에 전체 소스가 있어야 할뿐만 아니라 직접 또는 간접적으로 사용되는 모든 함수의 전체 소스가 컴파일러에서 사용할 수 있어야합니다. 또한 템플릿이 작동하는 방식 때문에 전체 소스도 .di 파일에 있어야합니다 (템플릿은 C++의 헤더 파일에 있어야합니다). 그래서, 당신이 물건이 .di 파일에 있어야 많은 경우가 있습니다.

정확히 어떤 상황에서 컴파일러가 항목을 제거할지 여부를 모르겠다. 템플릿이 자동으로 .di 파일로 끝나는 것을 제외하고는 이 있습니다. 그것은 컴파일러의 현재 구현과 그것이하는 최적화에 따라 변경 될 수 있습니다. 그러나 최소한 인라인 작업을 수행하려면 작은 기능 본문을 사용해야합니다. 대형 함수 본문과 작은 가상 함수의 본문 (어쨌든 인라인 될 수 없음)은 제거 될 가능성이 큽니다. 그러나 귀하의 예제는 가상이 아닌 작은 함수를 제공하므로 dmd는이 함수를 호출하여 모든 호출을 인라인 할 수 있습니다. .di 파일을 생성 할 때 dmd가 많은 것을 제거하고 싶다면, 아마도 큰 함수 나 클래스를 사용해야 할 것입니다.

4

에게 최적화 단단하게 모범을.

아니요, 입니다. 구현이 나중에 인라인 될 수있을만큼 작 으면 컴파일러는 인터페이스 파일에 구현을 그대로 둡니다.

관련 문제