본문 바로가기

C & C++

C/C++ 기초 - 구조체 ( Struct ), 비트 필드 ( Bit field )

구조체


#include <iostream>

struct My_struct
{
	int a;
	int i;
	short b;
	char c;
};

struct My_struct_2nd
{
	int a : 5;
	int i : 3;
	short b : 7;
	char c : 4;
};

int main(void)
{
	struct My_struct s1;
	struct My_struct_2nd s2;

	s1.a = 10;
	s1.b = 23;
	s2.c = 'a';

	printf("My_struct size : %d\n", sizeof(My_struct));			// 결과 12
	printf("My_struct_2nd size : %d", sizeof(My_struct_2nd));	// 결과 8

	return 0;
}

 '구조체'는 여러 변수를 묶어서 하나의 자료형으로 사용할 수 있게 하는 형식입니다. 예시 코드에서 My_struct s1;를 선언하고 My_struct 구조체 안에 들어있는 a, b, c에 각각 값을 넣어준 것처럼 구조체를 선언하면 안에 있는 변수 모두를 사용할 수 있게 됩니다.

 구조체의 메모리 크기는 특징이 있습니다. 처음에는 컴퓨터 환경에 따라 기본적인 메모리 크기를 결정합니다. 32 bit 환경이면 4 Byte, 64 bit 환경이면 8 Byte가 됩니다. 이 메모리 공간 안에 구조체 멤버로 선언된 변수들을 해당 변수의 메모리 크기만큼 할당합니다. 그러다가 기본 메모리 크기를 넘어서게 되면 선언된 변수 중에 가장 메모리 크기가 큰 자료형의 크기만큼 메모리 공간이 늘어납니다. 예시에서 My_struct 구조체의 메모리 크기가 12인 이유입니다.

 


비트 필드


  '비트 필드'는 구조체의 멤버 변수의 메모리 크기를 원하는 비트 수만큼 설정할 수 있게 해 줍니다. 예시 코드에서 My_struct_2nd의 멤버 int 변수 a의 옆에 : 5로 되어 있는 부분이 비트 필드 관련 내용입니다. int 변수는 원래 32 bit지만 5bit만 사용하겠다고 설정한 것입니다. 이렇게 선언하면 해당 변수는 5비트 밖에 사용하지 못하므로 [ -16 ~  15 ]의 범위를 가지는 변수가 됩니다. 실제 메모리 공간에도 영향을 줘서 My_struct와 My_struct_2nd의 멤버 변수는 같지만 두 구조체의 크기가 12 Byte와 8 Byte로 다른 이유가 이 때문입니다.