2010-06-06 7 views
5

가능한 중복 :
When to use std::size_t?std :: size_t를 사용하는 것이 좋습니다.

내가 예를 들어, 서명되지 않은 숫자는 내 코드에서 상수를 많이 가지고 카운터, 주파수 컷오프, 길이 등. int 또는 unsigned int 대신에이 모든 것에 std::size_t을 사용하기 시작했습니다.

그게 옳은 일입니까? STL 컨테이너가 크기를 위해 사용하기 때문에 시작했습니다. 문자열 위치 등에 사용됩니다.

+0

그건 정말 고의적으로 들리지만 왜 int로 가지 않을까요? –

+2

유효 복제본 [표준을 사용하는 경우 : size_t?] (http://stackoverflow.com/questions/1951519/when-to-use-stdsize-t) –

+0

참조 : http://stackoverflow.com/questions/ 1951519/when-to-use-stdsize-t –

답변

8

std::size_t은 배열 길이, 객체 크기 등과 같이 메모리 위치 계산에 사용할 유형입니다. STL 컨테이너는 다음과 같습니다. container_type::size_type을 사용하여 보통std::size_t으로 매핑 할 수 있지만이를 보장 할 수는 없습니다.

위의 용도로 사용되지 않는 음수가 아닌 정수를 보유해야하는 유형이 필요한 경우 unsigned short, unsigned intunsigned long의 문제점은 무엇입니까?

2

메모리에 저장된 개체의 크기를 나타내는 변수에 size_t를 사용할 수 있습니다. 그러나 다른 용도로 사용할 이유가별로 없습니다. 이것은 주로 unsigned int가 메모리 객체의 크기를 나타 내기에 충분하지 않을 수 있기 때문에 존재합니다. (16 비트 정수는 있지만 32 비트 주소 공간을 가진 아키텍처를 고려하십시오.)

3

size_t는 실제로 stddef.h에 정의 된 typedef이며 플랫폼에 따라 다르므로 실제로 그것에 대해 어떠한 가정도 할 수 없습니다. gcc 4.4 (i486)에서는 OS가 이미 정의하지 않는 한 긴 서명되지 않은 int로 정의됩니다. 예를 들어 i386 시스템의 Free BSD 5에서는 서명되지 않은 int가되고 ia64 컴퓨터에서는 unsigned long이됩니다. 그래서 예를 들어 당신은 때때로 거 실행하지만 일부 플랫폼/컴파일러

size_t i; 
... 
char buf[4]; 
sprintf(buf,"%u",i); 

처럼 뭔가를하려고하면 당신거야 버퍼 오버 플로우를 얻을.

요점은 이것이 size_t의 크기/유형에 대한 가정을해야한다면, 이식성 문제가 발생할 수 있다는 것입니다.

관련 문제