C언어에서 sizeof() 연산자는 피연산자의 크기를 바이트 단위로 반환하는 기능을 가지고 있습니다.
sizeof()의 리턴 타입은 size_t 이고, sizeof는 포인터, 데이터 타입, 구조체, 공용체 모두 사용 할 수 있습니다.
(1) 피연산자가 데이터 타입일 경우
size_t size_char = sizeof(char); // 1
size_t size_int = sizeof(int); // 4
size_t size_float = sizeof(float); // 4
size_t size_double = sizeof(double); // 8
(2) 피연산자가 표현식 일때
int a = 10;
double d = 10.24;
size_t size = sizeof(a + d); // 8
해당 코드에서는 8이 저장되게 됩니다.
a + d 연산 처리시 타입이 큰 double로 형변환이 되기 때문입니다.
sizeof는 컴파일 시간에 처리되는 경우가 있고, 런타임 시간에 처리되는 경우가 있다.
(1) 컴파일 시간 처리
#include <stdio.h>
#include <stddef.h>
int main()
{
int i = 10;
size_t size = sizeof(i++);
printf("size of i : %lu\\n", (long unsigned ) size); // 4
printf("value of i : %d\\n", i); // 10
return 0;
}
해당 코드에서는 4, 10이 출력되게 됩니다. i++ 의 증감 연산자는 적용되지 않습니다.
그 이유는 컴파일시에 i++를 바이트 숫자인 4로 변경되기 때문입니다.
해당 코드를 어셈블리어로 살펴보면
size_t size = sizeof(i++);
movl $0x4, 0x1c