2009-04-15 2 views
6

내가 이해할 수 있듯이 모든 멤버 함수는 D에서 가상이지만 컴파일러는 오버라이드되지 않는다고 판단되면 함수를 비 가상으로 만들 수 있습니다.D에서 멤버 함수가 가상 함수인지 확인하는 방법이 있습니까?

명확하지 않은 것은 멤버 함수를 재정의하지 않은 모듈을 컴파일 한 다음 멤버 함수를 재정의하는 모듈을 다른 곳으로 가져올 때 일어나는 일입니다. 원래 모듈을 다시 컴파일하지 않는다고 생각합니다. 단순히 외부 링크가있는 멤버 함수가 가상이라고 가정합니까?

답변

5

모든 D 멤버 함수는 기본적으로 가상입니다. 필자는 최적화 기능을 실제로 비 가상으로 만드는 컴파일러는 없다고 생각합니다. 클래스 또는 함수를 "최종"으로 표시하여 수동으로 수행 할 수도 있습니다.

1

필자는 FeepingCreature가 정확하다고 믿지만, 소스로부터 실행 파일을 직접 생성하는 경우 컴파일러가 그러한 최적화 만 고려할 것이라고 생각할 수도 있습니다.

2

FeepingCreature는 가상으로 만들 수없는 템플릿 기능을 제외하고는 대부분 정확합니다.

2

이 방법은 컴파일러 및 링커에 따라 다릅니다. 하지만 가상 함수 호출을 최적화 할 수있는 일반적인 상황은 클래스를 로컬로 인스턴스화 할 때입니다. 그런 다음 클래스의 유형이 컴파일 타임에 완전히 알려지기 때문에이 범위 내에서 직접 함수 호출을 수행 할 수 있습니다. 이 작업은 컴파일러 수준에서 수행 할 수 있습니다.

게다가 링커가 함수 구현을 결코 무시하지 않으면 링커가 최적화를 수행하고 가상 함수 호출을 해당 클래스의 직접 함수 호출로 바꿀 수 있습니다. 특히 클래스가 파생되지 않으면 멤버 함수에 대한 모든 호출을 직접 수행 할 수 있습니다. 마치 링커가 가능한 '최종'키워드를 삽입하는 것과 같습니다. 링커는 함수가 다른 라이브러리 나 실행 파일에서 재정의되었는지 여부를 모르기 때문에 링커는 내 보낸 클래스와 함수에이 최적화를 적용하지 않을 수 있습니다.

관련 문제