D 클래스에는 C++에서 요구하는 한 단어 대신 두 단어 (2 void *)의 오버 헤드가 있다고 들었습니다. 또한 vtable 레이아웃이 C++과 호환되지 않는다고 들었습니다. 나는 정확하게 기억합니까? 그렇다면 이러한 결정에 대한 근거는 무엇입니까?D 클래스의 오버 헤드
답변
몇 가지 : C++, 어떤 가상 함수가 제로 오버 헤드가 없습니다이 클래스에서
- .
- D에서 클래스는 항상
Object
에서 가상 함수를 상속하므로 항상__vptr
오버 헤드가 있지만 C++ 클래스 객체에는없는__monitor
도 있습니다. - C++과 D 모두 클래스가 구현하는 각 인터페이스에 대해
vptr
이 추가로 있습니다.
D에 클래스에 대한 런타임 정보가있는 TypeInfo
인스턴스에 대한 포인터가 포함되어 있기 때문에 vtable 레이아웃이 C++과 호환되지 않습니다. C++은 분명히 그렇게하지 않으므로 호환되지 않습니다.
extern (C++)을 사용하여 호환 가능한 vtable을 작성할 수 있음을 언급 할 가치가 있습니다. 아마도 오버 헤드를 원할 때 D의 구조체를 사용할 수 있다고 말해야합니다. –
음, D 개발자가이 구현을 변경하기를 바랍니다. 비동기 클래스에 "__monitor"가있는 이유는 무엇입니까? 또한 C++ 클래스는이 TypeInfo 기능을 갖고 있지는 않지만 C++이 D 가상 함수를 호출하는 것을 막을 필요는 없습니다. 그 반대로 TypeInfo를 vptr [-1]에두면됩니다. Object에서 opCmp, opEqual 등을 제거하는 방법에 대한 이야기가있었습니다. 잘하면, 적어도 단순한 경우에는 같은 시간에 C++ 바이너리 호환성을 추가하는 것을 고려할 것이다. (예, extern (C++)이 있지만 기본적으로 호환성의 단점은 무엇입니까?) – Qwertie
기본적으로 4 바이트가 차이를 만드는 데 충분한 수의 스팸성 개체를 사용하는 경우 디자인에 대한 문제가 발생합니다. D에는 POD 유형에 대한 구조가 있습니다. 또한 : C++ 자체가 하위 호환성의 단점으로 충분한 교훈을 얻지 못했습니까? – FeepingCreature
여분의 포인터는 동기화 된 클래스에 대한 모니터 객체에 대한 포인터입니다 (동기화되지 않은 클래스에 대해서는 포인터가 제거되었지만 발생하지 않았 음). 레이아웃은 사양의 ABI section에 설명되어 있습니다.
vtable 레이아웃이 C++ 컴파일러와 어떻게 다른지 잘 모르겠습니다. 누군가 다른 사람이 대답 할 수 있습니다.
구조체를 사용하고 상속을 시뮬레이트하기 위해'alias this'를 사용함으로써 D에서 가상 함수가없는 0 번째 오버 헤드 객체를 얻을 수있다. – dsimcha
"들으려고"할 필요가 없습니다. - 소스가 있습니다. 직접 찾아보십시오. :) – DejanLekic
그게 네가하는 일인데, git repos를 복제하고 100,000 개가 넘는 소스 코드를 수수께끼로 삼아서 간단한 질문에 대한 답을 찾기를 바란다. 나에 관해서는 누군가가 이미 대답을 알고 있는지 물어볼 것이다 : – Qwertie