본문 바로가기
번역/Bjarne Stroustrup's C++ Style and Technique FAQ

How are C++ objects laid out in memory?

by 겜게준 2018. 5. 9.

번역


c++ 오브젝트들은 어떻게 메모리에 배치되나요?


C 처럼, C++도 레이아웃을 정하지는 않고 반드시 충족해야만하는 의미적 조건[각주:1]만을 정의합니다. 따라서 구현이 다르면 다르게 동작합니다. 아쉽게도, 제가 알고있는 가장 좋은 설명은 구식에 현재 c++ 구현을 설명하지 않는 책에 있습니다: The Annotated C++ Reference Manual (보통 ARM이라고 부릅니다). 이 책에 주 레이아웃 다이어그램 예제가 있습니다. TC++PL의 2챕터에 아주 간단한 설명도 있습니다.


보통, C++은 하위 오브젝트들을 붙여서 간단하게 오브젝트들을 생성합니다. 


        struct A { int a,b; };


이것은 서로 옆으로 배치된 int 두개로 표현이 되고,


        struct B : A { int c; };


이것은 A가 int로 되어서 서로 옆으로 배치된 int 세개로 표현이 됩니다.[각주:2]


Virtual 함수는 전형적으로 각 클래스의 오브젝트에 virtual 함수들과 함께 포인터를 추가하는것으로 구현됩니다. 이 포인터는 적절한 함수 테이블을 가르킵니다. 각 클래스는 모든 클래스의 오브젝트가 공요하는 고요한 vtbl을 가지고 있습니다.[각주:3]




원문


How are C++ objects laid out in memory?


Like C, C++ doesn't define layouts, just semantic constraints that must be met. Therefore different implementations do things differently. Unfortunately, the best explanation I know of is in a book that is otherwise outdated and doesn't describe any current C++ implementation: The Annotated C++ Reference Manual (usually called the ARM). It has diagrams of key layout examples. There is a very brief explanation in Chapter 2 of TC++PL.


Basically, C++ constructs objects simply by concatenating sub objects. Thus


        struct A { int a,b; };


is represented by two ints next to each other, and


        struct B : A { int c; };


is represented by an A followed by an int; that is, by three ints next to each other.


Virtual functions are typically implemented by adding a pointer (the vptr) to each object of a class with virtual functions. This pointer points to the appropriate table of functions (the vtbl). Each class has its own vtbl shared by all objects of that class.

  1. 어느 상황에서 뭐는 되고 뭐는 안되고 같은것을 말합니다. [본문으로]
  2. 주소값 찍어보시면 쉽게 알 수 있습니다. [본문으로]
  3. Virtual 함수 구현을 설명하는 부분입니다. virtual의 동작은 virtual table 이라는 virtual 함수들의 주소값을 가지고있는 테이블에서 조회를 하게 되고, 각 클래스마다 따로 가져서 조회하게 됩니다. [본문으로]

댓글