반응형

C++ 비가상화(Devirtualization) : 가상 함수 최적화

  • C++에서 Devirtualization은 일반적으로 "비가상화" 또는 "가상 함수 최적화" 로 번역할 수 있습니다.

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을 우회하고 직접 호출 할 수 있습니다.

Devirtualization이 적용되지 않는 경우

cpp

void callFoo(Base* obj) {
    obj->foo(); // 동적 바인딩 (Devirtualization 불가능)
}
  • Base* 타입의 포인터를 통해 접근하면 컴파일러가 정확한 함수 결정을 할 수 없으므로 동적 바인딩(vtable 사용)이 발생합니다.

Devirtualization을 활성화하는 방법

컴파일러 최적화 옵션 사용 (-O2, -O3, -march=native)


final 키워드 사용 (파생 클래스에서 재정의 방지)

cpp

class Base {
public:
    virtual void foo() final; // Derived에서 재정의 불가 → Devirtualization 가능성 증가
};

constexpr, inline, static 사용하여 컴파일 타임 함수 해석 유도

728x90
반응형

+ Recent posts