1. 비어 있는 단일 클래스 = 1 바이트
  2. 필드를 가진 단일 클래스
class FieldSample
{
	char ch1;
};
// sizeof(inst) == 1
class FieldSample
{
	char ch1;
	char ch2;
}
// sizeof(inst) == 2

하지만 int 를 가운데에 추가하면 상황이 달라진다.

class Field Sample
{
	char ch1;
	int n1;
	char ch2;
}

// sizeof(inst) == 12

#pragma pack(1) 을 사용해서 1바이트 정렬을 할 수 있지만 이 경우 성능저하나 hardware exception 이 발생할 수도 있다. (arm, risc 아키텍쳐) 요즘 arm 은 발생하지 않는듯. snapdragon 870+는 괜찮음

  1. 멤버함수를 가진 단일 클래스
class FieldFunSample
{
public:
	int n1 = 1;
	
	void func1(){} = 메모리를 차지하지 않음
}
class FieldFunSample
{
public:
	int n1 = 1;
	
	virtual void func1(){}
}
//sizeof(inst) == 8

virtual 을 추가시 vtable에 대한 포인터가 추가되기 때문에 다음과 같은 layout을 갖게 됩니다.

[오프셋 4: 필드 n1] - 4 바이트

[오프셋 0: vtable 포인터] - 4 바이트

  1. 단일 상속 클래스
class A
{
public:
	int n1 = 1;
	void func1
	virtual void vfunc1
}

class BonA:A
{
public:
	virtual void vfunc2
}

class ConBonA: BonA
{
	virtual void vfunc3
}
//sizeof(BonA) == 12
//sizeof(ConBonA) == 16
BonA 할당된 메모리
오프셋 8: 필드 bonA::n2 - 4바이트
오프셋 4: 필드 A::n1 - 4바이트
오프셋 0: 필드 vTable 포인터 - 4바이트
ConBonA
[오프셋12: 필드 ConBonA::n3] - 4바이트
[오프셋 8: 필드 BonA::n2]  - 4바이트
[오프셋 4: 필드 A::n1]     - 4바이트
[오프셋 0: vtable 포인터]  - 4바이트

나중에 다시봐야 겠다. 어셈블리가 너무 많다.