반응형
C++
에서Devirtualization
은 일반적으로 "비가상화" 또는 "가상 함수 최적화" 로 번역할 수 있습니다.
- 원래 가상 함수(
virtual function
) 는 다형성(polymorphism
)을 위해vtable
(가상 함수 테이블)을 통해 동적 바인딩 됩니다. - 하지만 컴파일러가 호출할 함수 를 컴파일 타임에 결정 할 수 있을 때,
vtable
을 거치지 않고 직접 호출 하는 최적화 기법입니다. - 이를 통해 성능 향상(함수 호출 오버헤드 감소) 을 기대할 수 있습니다.
cpp
#include <iostream>
class Base {
public:
virtual void foo() { std::cout << "Base::foo\n"; }
};
class Derived : public Base {
public:
void foo() override { std::cout << "Derived::foo\n"; }
};
int main() {
Derived d;
d.foo(); // 정적 바인딩 → devirtualization 적용 (최적화 가능)
}
main
함수의d.foo();
는Derived::foo()
를 호출하는 것이 명확하므로 컴파일러가 vtable을 우회하고 직접 호출 할 수 있습니다.
cpp
void callFoo(Base* obj) {
obj->foo(); // 동적 바인딩 (Devirtualization 불가능)
}
Base*
타입의 포인터를 통해 접근하면 컴파일러가 정확한 함수 결정을 할 수 없으므로 동적 바인딩(vtable
사용)이 발생합니다.
✅ 컴파일러 최적화 옵션 사용 (-O2
, -O3
, -march=native
)
✅ final
키워드 사용 (파생 클래스에서 재정의 방지)
cpp
class Base {
public:
virtual void foo() final; // Derived에서 재정의 불가 → Devirtualization 가능성 증가
};
✅ constexpr
, inline
, static
사용하여 컴파일 타임 함수 해석 유도
728x90
반응형
'C C++' 카테고리의 다른 글
c-vector : 표준 C++에서 볼 수 있는 것과 유사한 C의 동적 배열 (dynamic array) 구현 (0) | 2025.02.27 |
---|---|
C++ 가상 테이블(vtable, virtual table)의 간접 참조(Indirection) (0) | 2025.02.19 |
댕글링 포인터(Dangling Pointer) (0) | 2025.02.19 |
Modern C++ 템플릿 자리 표시자(Template Placeholder) (0) | 2025.02.19 |
Dyno : 올바른 런타임 다형성(Runtime polymorphism) 수행 (0) | 2025.02.19 |