본문 바로가기

Linux

ssize_t 와 size_t .Posted by Heny2kawmi

kernel의 driver쪽을 손보다가 생소한 자료형이 있었다. 
바로 ssize_t와 size_t었다.
 
ssize_t : signed int
size_t : unsigned int
 
이러한 것을 두고 고전적인(primitive) 자료형이라 한단다. 일반적으로 <sys/types.h> 헤더에 선언되어 있는데, 사실 C의 typedef 선언을 통해서 정의되어 있다. 즉 새롭게 등장한 것이 아니라, 잘 알고 있는 int, float, long과 같은 기본 자료형을 가지고, 이름만 바꾸어 정의해 놓은 것이다. 이러한 자료형들은 꽤나 오래 전부터 존재하고 있엇다고 한다. 그렇다면 도대체 왜 이러한 것을 정의해 놓고 사용하는걸까?? int, short, float이 간단하고 널리 쓰이는데... 괜히 사람 머리아프게 한다...

이렇게 ssize_t나 size_t를 따로 정의하는 이유는 널리 쓰이는 int, short, float등의 자료형들의 size가 유동적이기 때문이다. 과거 int형은 16bit의 size를 가진적이 있었고, 지금은 32bit의 공간을 갖는다. 또 앞으로는 64bit의 size를 차지할 지도 모른다. 이렇게 이들의 size가 당대 운영체제와 컴퓨터에 따라 달라지기 때문에 작성해 놓은 code의 수정이 불가피해진다. 
  
때문에 지금처럼 헤더파일에 unsigned int를 size_t로 정의해 놓고 쓰게 되면, 나중에 시스템이 변경되어서 unsigned int가 더이상 32bit를 나타내지 않게 되었을 때, 32bit를 나타내는 다른 적절한 자료형을 가지고 헤더파일에 선언되어 있는 size_t를 재정의해 주기만 하면 된다.

즉 소스 코드는 바꾸지 않고 컴파일만 다시 한번 하면 새로운 시스템에서 잘 돌아가게 된다는 것이다. 

이것이 int, double, short, float과 같은 특정 자료형에 종속되지 않도록, 새로운 이름의 자료형을 정의해 주는 이유가 된다.