공부중

[C/C++] 구조체의 크기 본문

Programing/C, C++

[C/C++] 구조체의 크기

곤란 2021. 3. 15. 20:52
반응형

 

2017.07.07 - [Programing/C, C++] - [C/C++] 구조체의 크기에 관해서..

 

[C/C++] 구조체의 크기에 관해서..

퇴사후 휴식을 하고 잊어버린 C++을 ... 다시 공부하려고 하는데(진짜 다 잊어버려서 내가 당황스럽다..) 허리가 너무 아파서 겨우겨우 허리 잡으며 하나하나 정리라도 하면서 잊어버린거 혹은 그

hannom.tistory.com

과거에 정리했던거지만 좀 더 정리를 해보려고 한다.

 

구조체의 크기는 멤버중에서 가잔 큰 크기의 멤버 자료형을 기준으로 계산할 수 있다.

아래의 코드를 보면서 살펴보면...

struct sizeTest1
{
	int a;
	short b;
	char ch;
	int c;
};

struct sizeTest2
{
	int a;
	short b;
	int c;
	char ch;
};

struct sizeTest3
{
	int a;
	short b;
	char ch;
	int c;
	double d;
	sizeTest1 st1_1;
};

struct sizeTest4
{
	sizeTest1 st1;
	sizeTest3 st3;
};

struct sizeTest5
{
	short a;
};

struct sizeTest6
{
	char c;
	sizeTest5 st5;
};

제일 먼저 sizeTest1을 살펴보자

sizeTest1의 멤버중에서 int가 가장 큰 자료형이다. 그러므로 4byte씩 공간을 할당한다고 보면 된다.

int a (4byte)
short b (2byte) char ch (1byte) padding (1byte)
int c (4byte)

padding은 남는 공간을 의미하는것이라고 생각하면 된다.

총 4byte공간이 3개가 필요하게 되므로 12byte가 된다.

 

이어서 sizeTest2를 살펴보면...

sizeTest2의 멤버중에서 int가 가장 큰 자료형이므로 4byte씩 공간을 할당한다.

int a (4byte)
short b (2byte) padding (2byte)
int c (4byte)
char ch (1byte) padding (3byte)

위의 표와 같이 공간을 차지하게 되는데 중요한것은 선언된 자료형의 종류는 sizeTest1과 같지만 선언 순서가 바뀜으로 인해 sizeTest1과 4byte차이가 벌어졌다.

그러므로 총 4byte 공간이 4개가 필요하게 되므로 16byte가 된다.

 

다음으로 sizeTest3를 살펴보자

sizeTest3의 멤버중에서는 double이 가장 큰 자료형이므로 8byte씩 공간을 할당한다.

멤버로 잡은 sizeTest1 구조체가 제일 큰데 무슨소리냐 하지만 기본자료형을 가지고 판단해야한다.

int a (4byte) short b (2byte) char ch
(1byte)
padding
(1byte)
int c (4byte) padding (4byte)
double d (8byte)
sizeTest1 (12byte)
sizeTest1 (12byte) padding (4byte)

이전 구조체와는 다르게 8byte가 제일 크므로 8byte를 기준으로 사이즈를 잡게된다.

위 그림과 같이 총 40byte를 사용한다

 

sizeTest4는 멤버변수라고는 위에서 선언한 구조체 자료형들뿐이다. 기본 자료형들은 보이지 않고 어떤것을 기준으로 잡는지 궁금하다.

sizeTest1에서 제일 큰 기본 자료형은 int 4byte이다.

sizeTest3에서 제일 큰 기본 자료형은 double 8byte이다.

사실 위에서 언급은 안했지만 sizeTest3내부에 sizeTest1이 있었다. 하지만 sizeTest1의 멤버에는 최대 크기가 4byte인 int형뿐이었으므로 double보다 작게 되어 기준이되는 사이즈는 8byte가 된것이었다.

그러므로 sizeTest4에서는 sizeTest3에 있는 double의 크기인 8byte를 기준으로 사용한다.

sizeTest1 (12byte)
sizeTest1 (12byte) padding ( 4byte )
sizeTest3 ( 40byte )
sizeTest3 ( 40byte )
sizeTest3 ( 40byte )
sizeTest3 ( 40byte )
sizeTest3 ( 40byte )

아마 위와 같은 모습으로 메모리를 사용하지 않을까 싶다.

	sizeTest4 t4{};
	std::cout <<"t4.st1 addr : "<< &t4.st1 << std::endl;
	std::cout <<"t4.st3 addr : "<< &t4.st3 << std::endl;

 

위의 코드로 주소 위치를 확인한 뒤 멤버인 sizeTest1 st1과 sizeTest3 st3와의 주소 간격을 계산해보니 16byte만큼 떨어진것을 확인할 수 있었다. (위의 그림(?)처럼 메모리를 잡아 사용하고 있다는 말이다.

 

다음으로 살펴볼것은 sizeTest5와 sizeTest5를 멤버변수로 가지고 있는 sizeTest6이다.

sizeTest5는 멤버가 short하나니까 더 볼것도 없으므로 넘어가도록하고

sizeTest6는 멤버로 char와 sizeTest5 st5를 가지고 있다. 당연히 sizeTest5는 short를 멤버로 가지고 2byte를 사용하므로 기준은 2byte가 된다.

char c (1byte) padding (1byte)
sizeTest5 (2byte)

 

이제 위에서 언급한 구조체 크기의 출력결과를 살펴보자

	std::cout <<"sizeof(sizeTest1) : "<< sizeof(sizeTest1) << std::endl;
	std::cout <<"sizeof(sizeTest2) : "<< sizeof(sizeTest2) << std::endl;
	std::cout <<"sizeof(sizeTest3) : "<< sizeof(sizeTest3) << std::endl;
	std::cout <<"sizeof(sizeTest4) : "<< sizeof(sizeTest4) << std::endl;
	std::cout <<"sizeof(sizeTest5) : "<< sizeof(sizeTest5) << std::endl;
	std::cout <<"sizeof(sizeTest6) : "<< sizeof(sizeTest6) << std::endl;

 

이제 알 수있는 사실은 구조체는 멤버변수중에서 가장 큰 자료형의 크기를 기준으로 구조체의 총 크기를 잡는다.

기본 자료형(char, short, bool, int, long 그외 등등...)만을 기준으로 삼을 수 있으며 여러 자료형이 합쳐진 구조체를 멤버변수 자료형으로 사용하게 될 경우 그 구조체 자료형 자체가 기준이 되는것이 아닌 그 구조체 내부의 멤버 기본 자료형도 판단의 기준이 될 수 있다.

 

글솜씨가 없다보니 마지막 글이 엉망으로 정리된거 같지만 위의 예제를 보고 감이 왔으면 좋겠다

 

반응형