본문 바로가기
Ghost의 Linux C Note(노트)/Ghost의 Linux C언어 메모리 할당과 최적화

메모리의 세계는 더 넓어?...

by dark ghost 2012. 6. 18.
728x90
반응형

메모리 할당과 최적화.

1. 메모리에 어떻게 할당 되는 지를 보기 위해 짠 소스이다. 그리고 #if는 if문과 비슷하지만 사용 용도가 다르다. 그냥 if 문은 main() 함수내에서 어떠한 조건이 충족되는 지를 알기 위해 쓰여 진 것이라면 #if문은 Test를 위해 2개 이상의 소스 중 하나를 선택하여 Test를 할 수 있도록 사용 한 것이다. 그리고 #if 문 에 1이라는 코드는 지금 이 소스를 선택하여 컴파일 하겠다고 선택 한 것이다.

 int a; // 4 byte.

 char b; // 1 byte.

 int c; // 4 byte.

short d; // 2 byte.

char e; // 1 byte.

int f; // 4 byte.

char g; // 1 byte.

short h; // 2 byte.

char i; // 1byte.

2. 위 코드는 변수로 메모리에 할당을 받는다.  하지만 메모리는 4 byte 씩을 맞춰서 할당을 하려 하기 때문에 용량이 맞지 않으면 다른 주소에 할당을 한다. 아래 그림은 이 소스 대로 컴파일을 하면 할당 되는 메모리의 그림이다.

 

3. 위 그림은 위의 소스로 할 당 될때를 그림으로 그린 것이다. 변수 A가 4byte이므로 다차지 하고 변수 B는 char형이므로 1byte 차지 한다. 그러나 그 다음 변수인 C는 int형 이므로 4byte를 차지 하기 때문에 메모리 4byte 가 넘으므로 다른 곳에 저장 된다.  변수 D는 2 byte이고 E는 1 byte 이므로 딱 3 byte를 할당 받고 변수 F는 int형 이므로 4 byte를 할당 받는다. 그리고 변수 G와 H는 각각 char형과 short 이므로 1byte와 2byte가 할 당 된다. 그리고 마지막 변수 I는 char형이어서 1byte 만 할당 되어서 나머지 3 byte는 비 공간이 된다. 이렇게 할당 받아진 메모리 크기는 28 byte이고 8 byte는 낭비 되는 거나 마찬가지다.

 

4. 파일을 실행해서 실제로 메모리 크기가 28byte 인지 확인 해보았다. 아래소스는 변수 선언의 위치를 바꾸어 메모리를 할당을 조절하여 크리를 줄여 보려고 하였다.

4. #if 문에 0의 값을 줘서 수정 되어진 소스를 선택하게 만든다. 각 변수 들중  메모리 공간이 많이 남으면 거기에 4byte에 맞춰서 빈공간이 최대한 없도록 순서를 바꿔서 선언을 하였다. 그럼 순서를 바꾼 소스가 어떻게 메모리에 할당이 되어 지는지 아래의 그림을 통해 한 번 보겠다.

 

5. 위 그림에서 볼 수 있듯이 메모리 할 당을 할때 메모리 크기를 고려 하여 4byte를 꽉꽉 채워 넣었다. 그러니 메모리 크기가 조금은 남아서 여유 공간이 생겼다. 실제로 메모리 크기가 20 byte가 나오는지 파일을 실행 시켜 보았다.

 

6. 파일을 실행 시켜 메모리의 크기를 실행 시켜 보았는데 역시 20 byte가 나오는 것을 확인 할 수 있다.

728x90
반응형

댓글