[최적화] 

 

 

 

다음의 예제를 통해 변수가 메모리 영역에 어떻게 저장되는지 알아 보자

 

 

 

#include <stdio.h>

int main()
{
   int A;
   int B;
   int C;
   int D;
   float E;
   float F;
   float G;
   float H;
   short I;
   char J;
   int *K;
   char L;
   char *M;

   printf("%p\n",&A);
   printf("%p\n",&B);
   printf("%p\n",&C);
   printf("%p\n",&D);
   printf("%p\n",&E);
   printf("%p\n",&F);
   printf("%p\n",&G);
   printf("%p\n",&H);
   printf("%p\n",&I);
   printf("%p\n",&J);
   printf("%p\n",&K);
   printf("%p\n",&L);
   printf("%p\n",&M);

   return 0;
}

주소값을 표현해보면




이런식으로 메모리에 저장이 되는데 비어있는 공간이 생긴다(검은색 칠해진 부분) 이 메모리는 결국사용을 하지 않는다. 과거에는 메모리의 양이 적어서 사용을 하지만 요즘에는 메모리의 용량이 커져서 저 빈공간이 매우 미미한 양이므로 사용하지 않는다.
pc는 보통 32비트이기 때문에 최적화를 시킬때에 4의 배수 --->2의 배수 ---> 1의배수 순으로 최적화를 한다.
pc의 버스가 32비트를 보내면 32 비트를 전송하지만 8비트를 보내면 24비트를 차단시킨후 8비트만 보내기 때문에 32비트 보낼때보다 8비트를 보낼때가 속도가 느리다.

위 그림에서 L을 J앞의 빈공간을 사용해서 보낼수가 있는데 이것이 속도 최적화 방식이다.
pc에서는 메모리가 크기 때문에 메모리 최적화 보다는 속도 최적화에 중점을 둬야하고, 임베디드 에서는 속도 또는 메모리 둘 중 하나를 선택하여 최적화를 해야한다. 상황에 따라 최적화 방식을 선택하면 된다.

[부호확장]



char A = -1;
char B = 0xFF;
char C = 255;

int D = C;
unsigned int E = C;


C를 출력해보면 -1이 나온다.
char C = 255 에 비트를 보면
1 1 1 1 1 1 1 1

이다 기본적으로 signed 형이기 때문에 -1이 된다.
1바이트를 4바이트에 넣는 경우인데 제일 앞 비트가 1이므로 음수로 치고 1을 앞비트에 다붙인다.
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 1 1
32칸 전부가 1이 되기때문에 -1이 출력되는 것이다.

이것을 signed 부호확장이라고 한다

unsigned int E = C; 도 E를 출력해보면 애초에 C가 signed 형이기때문에 signed 부호확장이 일어나 -1이 된다.

#include <stdio.h>

int main()
{
   short A=0x7788;
   unsigned char *B=(unsigned char*)&A;

   printf("%02x\n",*B);
   ++B;
   printf("%x\n",*B);

   return 0;
}

88은

1 0 0 0 1 0 0 0

젤 앞비트가 1이므로 signed 부호확장이 일어나고


77은
0 1 1 1 0 1 1 1

제일 앞이 0이다 0일때는 나머지 비트에 0이 들어가는데 이것을 제로확장 이라고 한다.
*unsigned int D= char C;
형변환이 일어나는데 형변환의 순서는 1바이트를(char)먼저 4바이트로 변화 시키고 int D에 대입하는 순서로 한다.
CPU에서 변환을 시키게 되는데 그때에 원본의 형을 따라서 변환이 일어난다(signed 나 unsigned)

원본의 형이 signed 면 부호확장 unsigned면 제로확장이 일어나게 된다.