> 백엔드 개발 > C++ > 본문

C++ 가상 함수 테이블과 다형성 구현, 메모리 낭비를 피하는 방법

WBOY
풀어 주다: 2024-05-31 19:03:00
원래의
1140명이 탐색했습니다.

가상 기본 클래스는 추가 가상 함수 테이블을 만들지 않고도 여러 기본 클래스에서 상속을 허용하여 가상 함수 테이블 메모리 오버헤드를 최적화합니다. 최적화된 코드에서 모양 기본 클래스에는 더 이상 가상 함수 테이블이 없으며 원 및 직사각형 클래스는 동일한 가상 함수 테이블을 공유하므로 메모리 소비가 줄어듭니다.

C++ 가상 함수 테이블과 다형성 구현, 메모리 낭비를 피하는 방법

C++ 가상 함수 테이블 및 다형성 구현: 메모리 낭비 방지

소개

다형성은 객체가 해당 유형에 따라 상황에 따라 다른 동작을 나타낼 수 있도록 하는 객체 지향 프로그래밍의 핵심 기능입니다. . C++에서는 다형성이 가상 함수 테이블을 통해 구현됩니다. 그러나 vtable은 특히 개체 수가 많은 경우 메모리 낭비를 일으킬 수 있습니다.

가상 함수 테이블

가상 함수 테이블은 가상 함수에 대한 포인터가 포함된 테이블입니다. 가상 함수가 호출되면 컴파일러는 가상 함수 테이블을 사용하여 올바른 함수 구현을 찾습니다. 이렇게 하면 객체가 해당 유형에 대해 정의된 올바른 함수를 호출할 수 있습니다.

메모리 낭비

가상 함수 테이블이 메모리 공간을 차지합니다. 클래스에 가상 함수가 없더라도 각 클래스에 대해 vtable이 생성됩니다. 개체 수가 많은 애플리케이션의 경우 이로 인해 상당한 메모리 오버헤드가 발생할 수 있습니다.

최적화: 가상 기본 클래스 사용

가상 함수 테이블 메모리 낭비를 피하는 한 가지 방법은 가상 기본 클래스를 사용하는 것입니다. 가상 기본 클래스를 사용하면 추가 가상 함수 테이블을 만들지 않고도 여러 기본 클래스에서 상속할 수 있습니다.

실용 사례

다음 클래스 계층 구조를 고려하세요.

class Shape {
public:
  virtual void draw() = 0;
};

class Circle : public Shape {
public:
  void draw() override {
    // Draw a circle
  }
};

class Rectangle : public Shape {
public:
  void draw() override {
    // Draw a rectangle
  }
};
로그인 후 복사

최적화 전:

위 구현에서 Shape, Circle Rectangle에는 자체 가상 함수 테이블이 있습니다. Shape에는 가상 기능이 없기 때문에 메모리 공간이 낭비됩니다. ShapeCircleRectangle 都有自己的虚函数表。这会浪费内存空间,因为 Shape 没有虚函数。

优化后通过虚基类:

class ShapeBase {
public:
  virtual void draw() = 0;
};

class Shape : public ShapeBase {
};

class Circle : public Shape {
public:
  void draw() override {
    // Draw a circle
  }
};

class Rectangle : public Shape {
public:
  void draw() override {
    // Draw a rectangle
  }
};
로그인 후 복사

优化结果:

通过使用虚基类 ShapeBaseCircleRectangle 现在可以共享同一个虚函数表。这消除了 Shape

가상 기본 클래스를 통한 최적화 후: rrreee

최적화 결과:

🎜🎜가상 기본 클래스 ShapeBase, CircleRectangle 사용 code> code>는 이제 동일한 vtable을 공유할 수 있습니다. 이렇게 하면 <code>Shape의 vtable이 제거되어 메모리 오버헤드가 줄어듭니다. 🎜🎜🎜결론🎜🎜🎜가상 기본 클래스를 사용하면 C++의 가상 함수 테이블로 인해 발생하는 메모리 낭비를 피할 수 있습니다. 이렇게 하면 특히 개체 수가 많은 응용 프로그램에서 메모리 효율성을 향상시킬 수 있습니다. 🎜

위 내용은 C++ 가상 함수 테이블과 다형성 구현, 메모리 낭비를 피하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿