-
반응형
sizeof함수는 C와 C++에서 데이터 타입의 크기를 바이트 단위로 알아내는 많이들 혹은 흔히들 사용하는 시스템 함수이다. 개발을 하던 중에 sizeof의 결과를 함수의 인자로 받아야하는 경우가 생겼는데, 이때 갑작스렇게 혼란이 온 sizeof 함수의 리턴값은 어떤 타입인가 고민하게 되었다. 사이즈니깐 unsigned int라고 생각했는데, 완벽한 답은 아닌거 같았다.
위키피디아에서 검색해보니, 답은 size_t 이다.
예를 들어, 아래와 같이 데이터와 크기를 인자로 받아 전송하는 함수가 있다고 가정하였을 때, size_t 타입을 인자로 받아서 사용하는 것이 안전하다.
int send_somedata(void* data,size_t size); int num=10; send_somedata(&num,sizeof(int));
sizeof에 대한 추가 내용으로...
user-defined 데이터 타입(struct로 정의된 데이터 타입)에서도 sizeof함수를 사용하여 타입의 크기를 알아낼 수 있는데, 크기가 동일하지 않은 데이터 타입들의 조합으로 이루어진 struct에 대해서는 padding으로 인하여 크기가 예상했던 부분과 다를 수 있다.
※ padding이란 빈 공백으로 데이터의 크기를 맞추는 작업을 의미한다.
그 이유는 대부분의 프로세스는 메모리에 올려진 데이터가 정렬된 사이즈로 되어 있을 경우 처리 속도가 빠르기 때문에 다수의 멤버들로 이루어진 struct는 컴파일러에 의해서 데이터의 크기 정렬을 맞추어놓기 때문이다.
아래의 예제에서는 총 5bytes의 크기를 사용할꺼 같지만 word단위로 사이즈를 맞추기 위하여 8bytes의 출력이 나온다.
struct student { char grade; /* char is 1 byte long */ int age; /* int is 4 bytes long */ }; int main() { printf("%zu", sizeof (struct student)); return 0; }
블로그 글을 적으면서 자료를 함께 찾아보았는데 cpu와 메모리, 성능까지 고려되는 이야기이니 padding은 심도가 깊은 이야기이다. 곧 padding에 대해서 자세히 정리된 내용을 다루도록 하겠다.
참고자료
- http://en.wikipedia.org/wiki/Data_structure_alignment
- http://en.wikipedia.org/wiki/Sizeof
반응형