문제

GCC 4.4.1, C99

나는 사용 중입니다 size_t, 그리고 size_t 이다 unsigned int. 그러나 32 비트 또는 64 비트를 실행 중인지 여부에 따라 다릅니다.

나는 사용할 것이다 size_t 버퍼의 크기를 저장합니다.

따라서 아키텍처 전체를 사용하는 경우 이것이 휴대가 가능할 것이라고 생각하지 않습니다.

사용과 관련하여 질문 만 있습니다 size_t 32 또는 64 비트. 어떤 상황이 가장 심각한 문제를 일으킬까요?

도움이 되었습니까?

해결책

size_t 구현시 객체의 바이트 수를 보유 할 수 있어야합니다. 그것이 반환 유형의 이유입니다 sizeof ~이다 size_t.

예, 휴대용입니다.

다른 팁

다른 사람들이 말했듯이 size_t 결과를 저장하기 위해 정확하고 완벽하게 허용됩니다. sizeof() 또는 바이트로 표현 가능한 객체의 크기. 주의해야 할 것은 다음과 같습니다.

  1. size_t 크기가 동일합니다 서명되지 않은 정수 유형. 반드시 가장 큰 서명되지 않은 정수 유형과 같은 수의 바이트는 아닙니다. unsigned int, unsigned long, 등.
  2. sizeof(size_t) 구현 정의 된 바이트 수입니다 memcpy'ing 또는 다른 정수 유형에 할당 uintmax_t 나쁜 생각입니다. 나는 그것이 같은 크기 또는 작다고 가정하는 것이 안전하다고 확신하지 못합니다. uintmax_t.
  3. 쓰기 a size_t 이진 파일에 값을 가지고 다시 읽습니다. size_t 다른 프로세스에 의해, 다른 기계의 경우 또는 다른 컴파일러 옵션으로 컴파일 된 것에 의해 건강에 위험 할 수 있습니다.
  4. a size_t 네트워크를 가로 질러 가치 있고 sizeof(size_t) 다른 쪽의 버퍼는 다소 안전하지 않습니다.

이 모든 것은 다른 정수 유형을 제외한 다른 정수 유형의 표준 문제입니다. unsigned char. 그래서 size_t 다른 정수 유형만큼 휴대용입니다.

malloc () 또는 read ()를 사용하는 경우 버퍼에 size_t 또는 ssize_t를 사용하는 것이 합리적입니다. 휴대용 사용 크기 _max, ssize_max, sizeof (유형--버퍼) 및 %zd 또는 %zu printf ().

당신은 또한 Off_t와 ptrdiff_t / ssize_t를 얻었으며, 같은 방식으로 아키텍처마다 다릅니다.

올바르게 사용하면 아키텍처 전체에서 휴대 할 수 있습니다. 32 비트 시스템에서는 모두 32 비트의 폭이 있고 64 비트 시스템에서는 모두 64 비트가됩니다. 버퍼의 크기는 32 비트 시스템에서 32 비트 크기 _t보다 클 수는 없지만 64 비트 시스템에서는 훨씬 클 수 있습니다.

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

이 경우 "휴대용"이 의미하는 바를 파악하기는 어렵습니다. "휴대용"이라는 용어는 여러 가지 죄로 다른 해석을 허용합니다.

유형 size_t 매우 구체적인 목적이 있습니다. 주어진 구현에서 객체의 크기를 유지할 수 있습니다. 즉, 항상 결과를받을 수있는 유형입니다. sizeof() 운영자. 유형 size_t 다른 목적은 없으며, 의도 된 응용 프로그램 내에서는 휴대용이 가능한 한 100% 휴대용입니다.

당신이 묻는 어떤 종류의 "휴대용"은 다시 한 번 명확하지 않습니다.

size_t가 서명되지 않은 int라고 가정해서는 안됩니다.이 답변을 참조하십시오), 그러나 나는 그것이 두 아키텍처에서 동일한 범위를 가지고 있다고 생각합니다.

size_t를 사용하는 것에 따라 다릅니다.

메모리 버퍼의 크기를 결정하는 데 사용하는 경우 Size_T는 컴퓨터의 전체 메모리를 처리 할 수있을 정도로 크기 때문에 안전합니다. 따라서 메모리 버퍼가 그보다 커지면 어쨌든 문제가 있습니다.

반면, 우주의 별 수를 세기 위해 일반적인 부호없는 정수로 사용하면 32 비트 시스템에 문제가있을 수 있습니다 (64 비트 시스템에 대해서는 확실하지 않음).

이것의 유일한 진정한 심각한 문제는 Size_T의 다소 큰 배열 또는 많은 수치에 액세스하려고하는 것입니다.

규칙적인 "int"만으로 64 비트에서는 충분할 수 있지만 32 비트 시스템의 Int에 비해 너무 커서 32 비트에서 충돌을 일으킬 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top