2013-04-01 2 views
53

제 코드에서 int 또는 unsigned int는 사용하지 않습니다. 나는 portable를 위해서만 size_t 나 ssize_t를 사용한다. 예를 들어 : strlen는, string, vector ... 모두가 size_t를 사용은 size_t 또는 ssize_t를 사용해야합니다.

typedef size_t intc; // (instead of unsigned int) 
typedef ssize_t uintc; // (instead of int) 

때문에, 그래서 일반적으로 size_t를 사용합니다. 그리고 음수 일 수있는 경우에만 ssize_t을 사용합니다.

부호없는 정수 타입은 비트 배열로 저장을 치료하는 용도에 이상적입니다 :

는 그러나 나는 것을 찾을 수 있습니다. 정수 대신 부호없는 정수를 사용하면 양의 정수를 나타 내기 위해 비트를 하나 더 얻는 것이 거의 불가능합니다. 부호없는 변수를 선언하여 일부 값이 양수인지 확인하려는 시도는 일반적으로 암시 적 변환 규칙에 의해 무시됩니다.

The C++ Programming Language에 있습니다.

그래서 나는 의아해합니다. 내가 잘못? 왜 STL은 그 책에 대한 제안을 따르지 않습니까?

+0

크기를 나타내는 standart 라이브러리에 사용되는'size_t '. 컨테이너의 크기가 부정적 일 수 있다면 이상 할 것입니다. 인터페이스가 동작을 나타냅니다. 나는 책이 일상적인 사용을 가정하며 인터페이스가 아닌 것으로 가정한다. – kassak

+1

@kassak - 아니요,이 경우에는 부호없는 타입이 실제로 값에 대해 하나의 추가 비트를 얻는 데 사용됩니다. 위원회의 일부 구성원은 사용 가능한 메모리의 절반보다 큰'std :: vector '을 가질 수 있어야한다고 생각했습니다. 그리고 인용문은 "* 거의 * 결코"라고 말합니다 ... –

+0

@Bo Persson, 감사합니다, C++ lib는 size_t 범위를 사용합니다. 그러나 그것은 우리에게 문제를 가져 왔습니다. int를 사용한다면, 우리는 그들을 비교할 때주의해야합니다. – hgyxbll

답변

84

ssize_t은 반환 값이 유효한 크기이거나 오류를 나타내는 음수 값일 수있는 함수에 사용됩니다. 최소한 [-1, SSIZE_MAX] (SSIZE_MAX은 시스템에 따라 다름) 범위의 값을 저장할 수 있습니다.

크기를 바이트 단위로 반환 할 때마다 size_t를 사용해야하고, 크기를 바이트 또는 (음수) 오류 값으로 반환 할 때마다 ssize_t를 사용해야합니다.

참조 : http://pubs.opengroup.org/onlinepubs/007908775/xsh/systypes.h.html

+0

int 대신 ssize_t를 사용했습니다. CPU가 x64 일 때 ssize_t로 빠르게 처리하기 때문입니다. – hgyxbll

+14

글쎄,이 대답은 순수한 인터페이스 고려 사항에 근거한 결정의 결과를 완전히 설명하지 못합니다. 어떤 구현이라도'size_t'에 사용하는 것보다'ssize_t'에 더 넓은 타입을 사용할 것 같지 않습니다.즉, 음의 값을 반환하는 데 드는 대가는 해당 유형의 양의 범위 중 절반 *입니다. 나는. 'SSIZE_MAX'는 보통'SIZE_MAX/2'입니다. 이것은 명심해야한다. 대부분의 경우이 가격은 음의 값으로 '-1'을 반환하는 기능에 대해서만 지불 할 가치가 없습니다. – AnT

+3

부호없는 값을 가진 @AnT는 C++에서 가장 큰 실패 중 하나입니다. 가격이 지불 할만한 가치가없는 경우는 없습니다. 그런 큰 숫자가 필요하면 대신 int64_t를 사용하십시오 ... – thesaint

19

ssize_t 표준에 포함되지 휴대용 아닙니다. 객체의 크기를 처리 할 때는 size_t을 사용해야합니다 (포인터 차이는 ptrdiff_t도 있습니다).

+2

ssize_t는 POSIX에서 제공합니다. http://pubs.opengroup.org/onlinepubs/009696799/basedefs/sys/types.h.html – Kafu

관련 문제