sizeof 연산자는 컴파일러가 컴파일할때 크기를 인식한다. 그 크기를 상수로 바꾼다.
포인터를 동적할당한뒤 sizeof을 하면 배열을 sizeof한것과 달리 포인터의 크기만 나오게 된다.
클래스의 크기
컴파일러가 빈 클래스를 보면, 더미 맴버를 안에 넣어서 생성하게 된다.
1 | class A {}; |
빈 껍데기를 상속받은 클래스도 base class optimization을 수행하는 대부분의 컴파일러에서는 1 바이트가 된다.
Case 1. Empty Class 크기
1 | class Temp |
Case 2. 가상함수가 있는 클래스
1 | class CVBase // Size = 4 |
Case 3. Static 맴버 변수가 있는 클래스
1 | class CSObject // Size = 1 |
빈 클래스인 경우, 메모리 상에서 Instance 들이 Array에서 Empty Class의 Instance를 구분하기 위해서 최소한의 크기인 1byte를 할당.
Class의 Instance는 Heap or Stack 어딘가에 자리를 잡을수 있게 되고, Class Instance를 구분할수 있게 주소를 받게된다.
가상함수가 사용된다면 가상함수테이블를 가르키는 포인터가 클래스 내부안에 들어가게 되므로, 4 바이트 할당된다.
static 변수는 Class안에 있는것 처럼보이지만, 해당 클래스에 하나만 생성되고 모든 인스턴스에서 공동으로 접근가능하므로,
실제로는 안에 있지가 않다.
클래스와 구조체는 Default Access의 차이밖에 없다. 즉, 맴버변수에 따라서, Padding이 일어나는데, 가장 큰변수를 타입으로 저장하게 된다.
위의 예제는 int가 가장크므로sizeof(int) * 3
과 같게된다.
배열, 포인터의 전달과 크기
1 | int SIZE_p(int *p) |