2012-12-28 26 views
6

thể trùng lặp:
size_t vs. intptr_tCó phải uintptr_t và size_t giống nhau không?

Một số giao dịch mã của tôi với con trỏ và mất uintptr_t như là đầu vào vì nó có làm việc với con trỏ.

bây giờ tôi phải làm điều tương tự với số nguyên, Vì vậy, tôi muốn sử dụng lại mã đó.

Có phải là size_t giống như uintptr_t? Tôi có thể thay đổi việc triển khai và sử dụng cùng một mã cho cả hai con trỏ và số nguyên chỉ bằng cách thay thế uintptr_t bằng size_t?

Trả lời

15

size_t phải đủ lớn để chứa kích thước lớn nhất đối tượng có thể là . uintptr_t phải đủ lớn để chứa bất kỳ con trỏ nào. Vì điều này, nó là nhiều hơn hoặc ít đảm bảo rằng sizeof(uintptr_t) >= sizeof(size_t) (vì tất cả các byte trong đối tượng lớn nhất có thể phải địa chỉ), nhưng không nhiều. Trên các máy có địa chỉ tuyến tính, chúng có thể là kích thước tương tự . Mặt khác, trên kiến ​​trúc phân đoạn, nó là thông thường cho uintptr_t lớn hơn size_t, vì đối tượng phải nằm trong một phân đoạn, nhưng con trỏ phải có thể để giải quyết tất cả bộ nhớ.

2

Nó phụ thuộc vào việc triển khai (và bao gồm bộ xử lý, ABI, trình biên dịch, thư viện chuẩn). Bạn không đảm bảo rằng size_t cũng giống như uintptr_t; nhưng điều đó có thể xảy ra (trên 32 bit Linux x86 hoặc ARM, cả hai đều là số nguyên không dấu 32 bit).

Và mục đích của size_t là kích thước (đặc biệt là khối bộ nhớ được phân bổ), trong khi mục đích của uintptr_t là một số nguyên không dấu có cùng kích thước bit như con trỏ.

-1

Trình biên dịch khác nhau có kết quả khác nhau. Nếu bạn muốn chúng có cùng tác dụng, bạn phải đảm bảo rằng trình biên dịch của bạn phải nằm trên 32 bit Linux x86 hoặc ARM và điều đó sẽ đúng.

Các vấn đề liên quan