[c++/ warning C4541] : 'dynamic_cast'이(가) /GR- 스위치와 함께 다형 형식 'Base'에 사용되었습니다. 예기치 않은 결과가 발생할 수 있습니다. + vfptr에 대해서👨🏻💻 programming/◽ 에러 해결 메모2026. 3. 12. 11:54
Table of Contents
728x90
반응형

비주얼 스튜디오의 런타임 형식 정보 사용은 C++의 RTTI(Run-Time-TypeInformation)의 옵션입니다.
이 옵션은 보통 dynamic_cast나 typeid, std::type_info를 쓸 때 필요합니다.
- 예(/GR): 실행 중에 “이 객체의 실제 타입이 뭐지?”를 확인할 수 있음
- dynamic_cast, typeid, std::type_info 기반 동작 사용 가능
- 다형성 기반 코드, 상속 구조, 플러그인/프레임워크 코드에 안전
- 타입 정보가 추가돼서 .rdata 섹션 크기가 늘어난다.(약간)
- 아니요(/GR-): 그런 타입 정보 생성을 끔
- 런타임 타입 판별 기능을 사실상 못 쓴다고 보면 됨
- 성능·용량을 조금 더 아끼고 싶은 프로젝트에서, RTTI를 전혀 안 쓴다는 확신이 있을 때만 고려
dynamic_cast는 부모 포인터로 자식 객체를 가리키고 있을 때, 실행 중 실제 타입을 검사하거나 안전하게 다운캐스팅할 수 있게 해주는 기능입니다. 이런 경우 dynamic_cast 가 RTTI에 의존합니다. 아니오를 할 때는 바이너리 크기를 조금이라도 줄이고 싶고 성능에 민감해야 한다면 사용합니다.
- object 안에 vfptr 속성 내용 의미
- vfptr : vftable 시작 주소를 가리킴
- [ -1 ] RTTICompleteObjectLocator*
- 함수 포인터가 아니라 RTTI 메타 정보
- 상속/타입 계층 정보를 찾기 위한 입구 포인터
- 함수 포인터가 아니라 RTTI 메타 정보
- [ 0 ] virtual func #0 (가상 함수 엔트리)
- [ 1 ] virtual func #1 (가상 함수 엔트리)
- [ 2 ] virtual func #2 (가상 함수 엔트리)
- [ -1 ] RTTICompleteObjectLocator*
- vfptr : vftable 시작 주소를 가리킴
- 가상 함수 엔트리(vftable entry)의 의미와 구조
- 어떤 가상 함수를 호출할지에 대한 주소가 들어있음.
- 가상함수를 호출할 때, 프로그램은 객체 안의 vfptr로 vftable을 찾고, 거기에 해당하는 슬롯의 함수 주소를 꺼내 실제 함수를 부른다.
class Base {
public:
virtual void f();
virtual void g();
};
// -----------------------------//
// Derived용 vftable
// vftable
// [0] &Base::f
// [1] &Base::g
// -----------------------------//
class Derived : public Base {
public:
void f() override;
};
// -----------------------------//
// Derived용 vftable
// [0] &Derived::f // Base::f 대신 교체
// [1] &Base::g
그래서 예 / 아니오로 vfptr[-1] 의 메타 데이터 포인터가 있는지 없는지 확인할 수 있습니다.


728x90
반응형
'👨🏻💻 programming > ◽ 에러 해결 메모' 카테고리의 다른 글
| 라이브 이슈 문제와 해결 방안 정리 (화면이 깨진다. + 마크랑 이름이 잘려 보인다. + 사람이 다수 모이면 그러하다.) (2) | 2025.05.26 |
|---|---|
| [HTTP] Error 416 "The requested range is not satisfiable" (1) | 2024.02.07 |
@핑크코냥 :: 핑크코냥
존잘 프로그래머가 되고싶어