2012-12-28 2 views
6

가능한 중복 :
size_t vs. intptr_tuintptr_t와 size_t는 같은가요?

포인터 내 코드 거래의 일부와는 포인터와 함께 작동해야하기 때문에 입력으로 uintptr_t 걸립니다.

이제 정수와 동일한 작업을 수행해야하므로 코드를 다시 사용하고 싶습니다.

size_tuintptr_t과 동일합니까? 구현을 변경하고 uintptr_tsize_t으로 바꾸는 것만으로 포인터와 정수 모두에 동일한 코드를 사용할 수 있습니까?

답변

15

size_t은 가능한 최대 객체 크기 인 을 포함 할만큼 커야합니다. uintptr_t 포인터를 포함 할만큼 커야합니다. 이 점을 감안할 때 sizeof(uintptr_t) >= sizeof(size_t) (최대한 큰 객체 인 의 모든 바이트가 주소 지정 가능해야 함)이 보장되지만 그 이상은 보장되지 않습니다. 선형 주소 지정을 사용하는 컴퓨터에서는 같은 크기 일 것입니다. 반면에 세그먼트 화 된 아키텍처에서는 개체가 단일 세그먼트에 있어야하므로 은 uintptr_tsize_t보다 커야하지만 포인터는 이 모든 메모리를 처리 할 수 ​​있어야하므로 보통 입니다.

2

구현에 따라 다릅니다 (프로세서, ABI, 컴파일러, 표준 라이브러리 포함). size_tuintptr_t과 동일하다는 보장이 없습니다. 하지만 그럴 수도 있습니다 (32 비트 Linux x86 또는 ARM에서는 둘 다 32 비트 부호없는 정수입니다).

size_t의 목적은 크기 (특히 할당 된 메모리 청크) 인 반면 uintptr_t의 의도는 포인터와 동일한 비트 크기의 부호없는 정수 여야합니다.

-1

다른 컴파일러는 서로 다른 결과를 가지고 있습니다. 동일한 효과를 원한다면 컴파일러가 32 비트 Linux x86 또는 ARM에 있어야하며 올바른 결과를 얻어야합니다.