카테고리 없음

[C언어] 메모리 최적화 시키기 - #pragma pack

s뽈록이s 2013. 7. 16. 12:23
struct my
{
	int a;
	char b;
	short c;
	char d;
}typedef my;

#pragma pack(push, 1)
struct my_
{
	int a;
	char b;
	short c;
	char d;
}typedef my_;
#pragma pack(pop)

void main()
{
	my temp;
	my_ temp_;
	printf("size = %d\n", sizeof(temp));
	printf("size = %d\n", sizeof(temp_));
}

프로그램 실행화면


조금 복잡한 프로그램을 완성하기 위해서는 구조체를 쓰면 조금 더 쉽게 만들 수 있다. 이 구조체를 선언할 때 32bit 운영체제는 4바이트 단위 기준으로 메모리를 할당한다.


int(4), char(1), short(2), char(1)을하면 8바이트가 나와야 하지만 결과는 12바이트가 나온다. 이는 4바이트 단위로 짤라서 메모리를 할당할 기 때문에 char(1), short(2)가 4바이트를 차지하게 된다.


그리고 나머지 마지막 char(1)이 4바이트를 차지하면서 12바이트를 차지하게 된다. 프로젝트 설정 대화상자에서 이 바이트 단위를 설정할 수 있지만 프로그램 상에서 변경하는 것이 더 좋다.


프로그램 상에서는 자유롭게 변경가능하지만 프로젝트 설정 대화사장에서는 한번 수정 후 변경이 불가능하다. 즉 원하는 구간에서 변경이 불가능하다.


이때 원하는 구역에서 이 기준 바이트 단위를 변경할 수 있는 녀석이 #pragma pack이다. #pragma pack(n) n은 디폴트 8이며 지정해줄 수 있다.


만약 기존 바이트 단위를 기억했다 다시 돌려놓고 싶다면 위에 있는 프로그램과 같이 push, pop해주면 된다. 이 기준 단위를 저장하는 별도의 스택이 존재하기 때문에 가능하다.


데스크탑 환경에서는 메모리가 워낙 크다보니 크게 신경쓰지 않아도 되겠지만 메모리가 턱없이 부족한 마이크로프로세서는 1바이트라도 아껴야 원하는 동작을 모두 집어넣을 수 있기 때문에 아끼는 습관을 길러두어 나쁠 것은 없다.