피드로 돌아가기
Devirtualization and Static Polymorphism
Dev.toDev.to
Backend

Virtual Dispatch 제거 및 Static Polymorphism을 통한 런타임 비용 제로화

Devirtualization and Static Polymorphism

David Álvarez Rosa2026년 5월 23일6advanced

Context

Virtual Dispatch 기반의 다형성 설계는 vtable 참조 및 pointer indirection으로 인한 오버헤드를 발생시킴. 이러한 구조는 Inlining을 방해하고 Branch Misprediction을 증가시켜 latency-sensitive한 경로의 성능 저하를 초래함.

Technical Solution

  • vtable과 vptr 제거를 통한 Object Layout 최적화 및 메모리 간접 참조 단계 축소
  • -fwhole-program 및 -flto 플래그 적용을 통한 Cross-TU 분석 기반의 Devirtualization 수행
  • final 키워드 명시를 통한 컴파일 타임의 구체적 타입 확정 및 Direct Call 유도
  • CRTP(Curiously Recurring Template Pattern) 도입을 통한 정적 다형성 구현 및 컴파일 타임 바인딩
  • C++23 'deducing this' 적용으로 클래스 전체 템플릿화 없이 멤버 함수 단위의 Static Dispatch 구현
  • -O3 최적화 단계에서 모든 호출부를 Constant-folding 및 Inlining 처리하는 구조 설계

- 성능 임계 경로(Hot Path) 내 virtual 함수 호출 존재 여부 확인 - 상속 구조가 고정된 경우 `final` 키워드를 추가하여 Devirtualization 가능성 검토 - 런타임 다형성이 불필요한 추상화 계층에 CRTP 또는 C++23 deducing this 도입 고려 - LTO(Link-Time Optimization) 설정을 통해 번역 단위 간 최적화 범위 확대

원문 읽기