2009-11-08 4 views
3

GCC 4.4.1, C99size_t는 휴대용입니까?

내가 size_t을 사용하고

size_tunsigned int입니다. 그러나 이는 32 비트 또는 64 비트를 실행 중인지 여부에 달려 있습니다.

버퍼 크기를 저장하려면 size_t을 사용합니다.

아키텍처 전반에서 사용하는 경우 매우 유용 할 것 같지 않습니다.

그냥 32 비트 또는 64 비트 중 하나에서 size_t을 사용하는 질문입니다. 어떤 상황에서 가장 심각한 문제가 발생합니까?

답변

6

size_t은 구현시 모든 개체의 바이트 수를 보유 할 수 있음을 보증합니다. 반환 유형이 sizeof 인 이유는 size_t입니다.

네, 휴대용입니다.

+7

size_t는 이진 파일에 size_t 유형 변수를 저장하거나 네트워크 연결을 통해 보내지 않으려 할 때만 이식 가능합니다. 두 번째로 시작하면 바닥에 붙어있는 매우 휴대하기 힘든만큼 휴대가 가능합니다. –

-2

큰 문제는 크기가 큰 배열이나 큰 수에 액세스하려고하는 것뿐입니다.

일반 "int"와 마찬가지로 64 비트에서는 충분하지만 32 비트 시스템에서는 int에 비해 너무 크기 때문에 32 비트에서 충돌이 발생할 수 있습니다.

1

malloc() 또는 read()를 사용하는 경우 버퍼에 size_t 또는 ssize_t를 사용하는 것이 좋습니다. 이식성을 위해 SIZE_MAX, SSIZE_MAX, sizeof (버퍼에있는 타입) 및 % zd 또는 % zu printf()를 사용하십시오.

+0

Microsoft의 C 컴파일러는'printf()'의 'z'크기 수정자를 지원하지 않습니다. – Novelocrat

+0

'z' 수정자는 C99 표준의 일부입니다. Microsoft 컴파일러는 지금까지 C89/90을 사용했습니다. C89/90에서'size_t' 인쇄의 "portablility"는 수동으로 구현되어야합니다. – AnT

+0

저 bas ... 나는 잊었다. 글쎄, 그는 C99에 대해 물어 보았다. 나는 그가 리눅스의 낙관적 인 할당이나 blithelyly (count * sizeof())가 오버플로하지 않거나, 처음에 많은 메모리를 할당 할 필요가 있다고 생각하는 "가장 심각한"문제에 대해 정말로 물었다. – paul

0

size_t가 부호없는 int (see this answer)라고 가정해서는 안됩니다. 그러나 두 아키텍처에서 동일한 범위를 가지고 있다고 생각하지 마십시오.

0

size_t를 (를) 사용하는 대상에 따라 다릅니다.

메모리 버퍼의 크기를 결정하는 데 사용하는 경우 size_t는 모든 컴퓨터의 전체 메모리를 처리 할만큼 충분히 크기 때문에 안전합니다. 따라서 메모리 버퍼가 그보다 큰 경우 문제가 발생합니다.

반면에 유니버스의 별 개수를 계산하기 위해 일반 부호없는 정수로 사용하면 32 비트 시스템에서 문제가 발생할 수 있습니다 (64 비트 시스템에 대해서는 잘 모름).

+0

사실이 아닙니다. 'size_t'는 구현에 의해 지원되는 가장 큰 객체의 크기를 유지하기에 충분합니다. 'size_t'는 전체 메모리를 주소 지정하기에 충분하지 않은 * NOT *입니다. 후자의 경우'intptr_t' /'uintptr_t'가 필요합니다. – AnT

+0

나는 고쳐졌다. 그러나 여전히 가장 큰 목표는이 경우에 필요한 것이거나 다른 문제가있는 것입니다. – Jonatan

1

당신은 off_t와 ptrdiff_t/ssize_t도 가지고 있는데, 같은 방식으로 아키텍쳐마다 다르다.

올바르게 사용하면 아키텍처간에 호환성이 있습니다. 32 비트 시스템에서는 모두 32 비트 폭이지만 64 비트 시스템에서는 모두 64 비트 폭입니다. 이것은 원하는 것입니다. 버퍼의 크기는 32 비트 시스템에서는 32 비트 size_t보다 클 수 없지만 64 비트 시스템에서는 훨씬 더 클 수 있습니다.

int, longs 또는 다른 것을 사용해서는 안됩니다. 다른 것 외에도 long의 크기는 플랫폼 (대부분의 32 비트 시스템에서는 32 비트, 64 비트 유닉스 시스템에서는 64 비트, 64 비트 Windows에서는 32 비트)에 따라 다릅니다.

1

"휴대용"이 무슨 뜻인지 알기는 어렵습니다. "휴대용"이라는 용어는 여러 가지 다른 의미로 해석 할 수 있습니다.

유형 size_t은 매우 특정한 목적을 가지고 있습니다. 주어진 구현에서 모든 객체의 크기를 유지할 수 있습니다. 나는. 항상 sizeof() 연산자의 결과를 수신 할 수있는 유형입니다. 유형 size_t은 다른 목적이 없으며 의도 한 응용 프로그램 내에서 100 % 이식성이 있습니다.

당신이 묻는 "휴대 가능한"종류는 다시 한번 분명하지 않습니다.

+0

size_t를 사용하여 버퍼 크기를 얻고 있습니다. 내가 소켓 프로그래밍과 메시징을하고 소스 코드는 리눅스와 윈도우 모두에서 컴파일됩니다. 클라이언트에서 보낸 데이터의 size_t를 얻어야합니다. 감사합니다 – ant2009

+0

@robUK,이 중요한 정보를 질문에 추가해야합니다. – quinmars

4

다른 사람들이 말했듯이 size_tsizeof()의 결과 또는 표현할 수있는 객체의 크기를 바이트 단위로 저장하는 데 적합합니다. 당신은 무엇을 조심해야 할 것은 다음과 같습니다

  1. size_t일부 부호없는 정수 타입와 같은 크기입니다. 반드시 최대 부호 정수 타입 unsigned int, unsigned long으로서 동일한 수의 바이트 등
  2. sizeof(size_t)없는 바이트 구현 정의 수 있으므로 memcpy '를 보내고 또는 uintmax_t 이외 정수형 할당은이다 나쁜 생각. 나는 그것이 동일 크기이거나 uintmax_t보다 작은 것으로 가정하는 것이 안전하다고 확신하지 못한다.
  3. size_t 값을 이진 파일에 쓰고 다른 프로세스, 다른 컴퓨터 또는 다른 컴파일러 옵션으로 컴파일 한 내용으로 다시 size_t으로 읽으면 건강에 위험 할 수 있습니다.
  4. 네트워크를 통해 size_t 값을 보내고 다른 쪽 버퍼에 sizeof(size_t) 버퍼를 사용하여 수신하려고하면 다소 안전하지 않습니다.

이들은 모두 unsigned char을 제외한 다른 정수 유형의 표준 문제입니다. 따라서 size_t은 다른 정수 유형과 마찬가지로 이식성이 뛰어납니다.