ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • sizeof 함수의 리턴값은 어떤 타입인가??
    2012. 1. 5. comments

    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  


    반응형

    댓글

Designed by Tistory.