Struct 크기 결정

기본적으로 가장 큰 멤버변수 크기 간격으로 정렬하여 저장한다.

만약 일정 크기 간격으로 딱 나누어지지 않으면 그 사이를 그냥 빈공간으로  놔둔다. 이것을 패딩이라고 한다.

 

 

Struct sample

{

    char a;

    int b;

    double c;

};

이 경우 메모리에 이렇게 적재 된다.

가장 큰 double(8 byte) 기준으로 저장 간격이 정해져 각 변수마다 남는 공간을 패딩하여 채운다.

결국 8 byte x 3 으로 총 24 byte 할당된다.

 

변수의 크기대로 결정되길 원한다면 #pragma pack 을 사용하면 된다.

 

 

#pragma pack( push, n) 

구조체의 크기를 최소 n 만큼 간격으로 정렬할 수 있게끔 만들어 준다.

 

#pragma pack(push, 1)    // 최소 1byte 크기 만큼 간격으로 정렬할 수 있게끔 한다.

Struct sample

{

    char a;

    int b;

    double c;

};

#pragma pack(pop)        // 특정 범위만큼만 적용하려면 pragma pack 해제를 짝으로 이뤄야 한다.

 

해당 규칙은 class 도 동일하게 반영된다.

 

 

Class 크기 결정

class의 크기 결정도 struct와 다를바 없다.

멤버함수가 있어도 달라지지 않는다.

그러나 가상 함수가 있다면 달라진다. (struct 또한 동일 적용 됨.)

 

가상 함수가 있으면 해당 클래스는 가상 함수 테이블(배열)이라는 정보가 추가된다.

그리고 그 테이블을 가르키는 포인터 변수가 클래스에 하나 추가된다.

포인터이기 때문에 환경별로 4byte 또는 8byte 만큼의 변수를 갖게 된 셈이 되는것이고

그렇기 때문에 가장 큰 자료형을 결정하는데 기여를 한다.

64비트 환경에서는 포인터는 8byte이고 이것보다 큰 자료형이 없다면 8byte 기준으로 패딩을 하게 되는 것이다.

 

예)

struct Sample
{
    char a;
    short b;
    int d;
    virtual int get() { return d; }
};

크기가 몇이 나올까?

16이다.

8byte 간격으로 채워지기 때문에  첫번째 8byte에 [char, short, int] 가 다 포함이 되고 두번째로 가상 함수 포인터 8byte가 채워진다.

 

*가상 함수가 몇개가 있던 가상 함수 포인터는 하나다.

 

 

+inline

c++의 struct는 멤버함수가 다 inline으로 만들어진다고 배웠던 것 같은데 아닌가보다.

class와 마찬가지로 inline을 명시한다고 적용되는 것도 아니고 안붙인다고 inline처리 안되는 것도 아닌 것 같다.

'c, c++ 리마인드' 카테고리의 다른 글

c++ stringstream  (0) 2023.08.27
c++ cast  (0) 2023.08.26
Big O  (0) 2023.08.24
Lvalue, Rvalue, &&  (0) 2023.08.23
realloc 주의점  (0) 2023.08.23

+ Recent posts