프로그래밍

c언어/c++ sizeof

업글 2020. 11. 12. 23:08

안녕하세요 업글입니다. 이번에는 sizeof 연산자에 대해서 포스팅해보겠습니다.

 

sizeof 연산자는 바이트 단위로 크기를 반환해주는 연산자입니다.

예를 들어서 32bit 시스템에서 sizeof(int)는 4를 반환하게 됩니다.

 

sizeof가 전처리기에서 치환되는지 컴파일 타임에 치환되는지 런타임에 치환되는지

정확히 모르시고 착각하시는 분들이 간혹 있으신 거 같습니다.

결론부터 말씀드리자면 sizeof 연산자는 컴파일 시간에 치환되게 됩니다.

 

sizeof가 런타임에 치환되는지 착각하고 sizeof 중복을 줄이기 위해 아래의 예제와 같이 사용하는 경우를 봤었습니다.

 

예제.

#define COUNT_OF(arr) (sizeof(arr)/sizeof(arr[0]))

 

int main()

{

 int arr[10];

 int sum = 0;

 int count;

 count = COUNT_OF(arr);

 

 for(int i=0; i<count; i++){

  arr[i] = i;

 }

 

 for(int i=0; i<count; i++){

  sum += arr[i];

 }

 

 return 0;

}

위와 같은 경우 컴파일 최적화를 통해서 size변수가 상수로 치환되어

size대신 COUNT_OF(ARR)를 넣은 것과 동일한 결과가 나올수도 있지만

최적화가 없다고 가정했을 때 큰 차이는 없지만 size변수에 넣어주는 시간과 size변수 메모리로 인해

오히려 더 비효율적인 코드가 되게됩니다.

또한, size대신 COUNT_OF(ARR)를 사용했을 때와 다르게 직관성이 떨어지기 때문에 가독성도 좋지 않게 됩니다.

그러므로 크기를 치환 해야 하는 경우 sizeof를 걱정없이 사용하시면 됩니다.

 

sizeof를 사용하여 자주 실수하는 경우에 대해서 추가로 설명드리겠습니다.

예제.

#define COUNT_OF(arr) (sizeof(arr)/sizeof(arr[0]))

 

int main()

{

 int arr[10], sum;

 

 sum = add(arr);

 

 return 0;

}

 

int add(int arr[])

{

 int i, sum;

 

 sum = 0;

 for(i=0; i<COUNT_OF(arr); i++)

 {

  sum += arr[i];

 }

 

 return sum;

}

위와 같이 구현을 하게 되면 arr[]는 포인터이기 때문에 sizeof(arr)는 4를 반환하게 되고

arr[0]는 int형이기 때문에 sizeof(arr[0])도 4를 반환하게 됩니다.

그러므로 원래의 목적과 다르게 동작하게 됩니다.

위와 같이 함수의 인자로 주소를 넘기는 경우, 인자의 count값이나 size값도 같이 넘겨줘야 합니다.

 

예제.

#define COUNT_OF(arr) (sizeof(arr)/sizeof(arr[0]))

 

int main()

{

 int arr[10], sum;

 

 sum = add(arr, COUNT_OF(arr));

 return 0;

}

 

int add(int arr[], int count)

{

 int i, sum;

 

 sum = 0;

 for(i=0; i<count; i++)

 {

  sum += arr[i];

 }

 

 return sum;

}

 

마지막으로 다시 한번 강조드리겠습니다. sizeof는 컴파일 타임에 치환 되게 됩니다.

'프로그래밍' 카테고리의 다른 글

c언어/c++ 이동평균필터  (0) 2020.12.13
c언어/c++ 함수포인터  (0) 2020.11.26
쓰레드(Thread)에 대한 생각  (0) 2020.11.12
c언어/c++ int 크기  (0) 2020.11.11
c언어/c++ const  (0) 2020.10.21