포인터 내 코드 거래의 일부와는 포인터와 함께 작동해야하기 때문에 입력으로 uintptr_t
걸립니다.
이제 정수와 동일한 작업을 수행해야하므로 코드를 다시 사용하고 싶습니다.
size_t
은 uintptr_t
과 동일합니까? 구현을 변경하고 uintptr_t
을 size_t
으로 바꾸는 것만으로 포인터와 정수 모두에 동일한 코드를 사용할 수 있습니까?
포인터 내 코드 거래의 일부와는 포인터와 함께 작동해야하기 때문에 입력으로 uintptr_t
걸립니다.
이제 정수와 동일한 작업을 수행해야하므로 코드를 다시 사용하고 싶습니다.
size_t
은 uintptr_t
과 동일합니까? 구현을 변경하고 uintptr_t
을 size_t
으로 바꾸는 것만으로 포인터와 정수 모두에 동일한 코드를 사용할 수 있습니까?
size_t
은 가능한 최대 객체 크기 인 을 포함 할만큼 커야합니다. uintptr_t
은 포인터를 포함 할만큼 커야합니다. 이 점을 감안할 때 sizeof(uintptr_t) >= sizeof(size_t)
(최대한 큰 객체 인 의 모든 바이트가 주소 지정 가능해야 함)이 보장되지만 그 이상은 보장되지 않습니다. 선형 주소 지정을 사용하는 컴퓨터에서는 같은 크기 일 것입니다. 반면에 세그먼트 화 된 아키텍처에서는 개체가 단일 세그먼트에 있어야하므로 은 uintptr_t
이 size_t
보다 커야하지만 포인터는 이 모든 메모리를 처리 할 수 있어야하므로 보통 입니다.
구현에 따라 다릅니다 (프로세서, ABI, 컴파일러, 표준 라이브러리 포함). size_t
은 uintptr_t
과 동일하다는 보장이 없습니다. 하지만 그럴 수도 있습니다 (32 비트 Linux x86 또는 ARM에서는 둘 다 32 비트 부호없는 정수입니다).
size_t
의 목적은 크기 (특히 할당 된 메모리 청크) 인 반면 uintptr_t
의 의도는 포인터와 동일한 비트 크기의 부호없는 정수 여야합니다.
다른 컴파일러는 서로 다른 결과를 가지고 있습니다. 동일한 효과를 원한다면 컴파일러가 32 비트 Linux x86 또는 ARM에 있어야하며 올바른 결과를 얻어야합니다.