Published 2023. 6. 16. 17:31
  • Dynamic Dispatch - 클래스가 가상 함수를 가질 경우
    • Dynamic Dispatch는 클래스 메소드가 오브젝트의 타입에 따라 다르게 작동하는 것이다. Virtual Function을 통해서 클래스의 다형성을 구현할 때, Dynamic Dispatch가 사용된다고 할 수 있다.
    • 그러나 Virtual Function을 실행할 때, 컴파일러는 자동적으로 Runtime LookUp(클래스의 계층구조를 따라 적합한 함수를 선택하는 것)이라는 추가적인 동작을 한다.
    • Vtable은 클래스가 Virtual Function을 가질 때, 자동적으로 생성되는 자료구조이며, 이 Vtable은 해당 클래스의 Virtual Function을 가리키는 포인터를 가지고 있다. 따라서, 추가적인 메모리를 할당한다.
    • Runtime LookUp과 Vtable 때문에, 모바일 환경에서 Virtual Function은 잠재적으로 Cache Miss를  일으킬 수 있다.
  • Object Layout
    • 객체의 메모리의 크기는 멤버 변수와 가상함수의 유무, 그리고 padding과 alignment bytes에 의해 결정된다.
    • 객체가 인스턴스화될 때, 해당 객체가 메모리에 차곡차곡 정리되는 모습을 Object Layout이라고 하며, 데이터가 차곡차곡 정리되는 모습을 Memory Layout이라고 한다. 이때, 차곡차곡 정리하기 위해서, 컴파일러가 aligne 하기 위해 의도적으로 추가하는 쓰레기 값(오버헤드 추가)들이 padding과 alignment bytes이다.(64비트 아키텍쳐에서 전형적인 메모리는 8바이트 단위이다.)
    • 그러나 클래스 멤버가 적절하게 aligne 되어 있지 않으면, 퍼포먼스 이슈나 프로그램의 잠재적인 크래쉬의 원인이 될 수 있다.
  • Copying, Moving and Dynamic Allocation
    • 클래스 안의 모든 멤버를 복사하거나 이동하는 연산은 잠재적으로 비용이 크다.
    • 복사와 이동 연산을 허용하는 클래스 멤버 안에 mutex나 file handler 같은, 복사와 이동을 해서는 안 되는 리소스가 있을 경우 잠재적인 버그를 양산한다.
    • 큰 메모리를 힙메모리 공간에 할당할 경우, 작은 메모리를 스택메모리 공간에 할당할 경우보다 비용이 크다.
  • Constructors and Destructors
    • 객체의 생성과 소멸은 빈번하게 일어난다. 따라서 생성자나 소멸자가 코스트가 크거나, 클래스 자체가 많은 데이터 멤버를 포함할 경우 오버헤드가 발생한다.

'C++' 카테고리의 다른 글

[C++11] Move Semantic에 대한 간단한 설명  (1) 2022.09.23
[C++] Iterator, 반복자  (1) 2022.09.19
[C++14] Virtual Inheritance  (0) 2022.09.18
[C++20] Concepts  (0) 2022.09.17
값 카테고리, 타입 카테고리  (0) 2022.07.04
복사했습니다!