Скажем, самый большой объект, который может иметь ваш компилятор/платформа, составляет 4 ГБ. size_t
тогда 32 бит. Теперь предположим, что вы перекомпилируете свою программу на 64-битной платформе, способной поддерживать объекты размером 2^43 - 1. size_t
будет как минимум 43 бит (но обычно это будет 64 бит в этой точке). Дело в том, что вам нужно только перекомпилировать программу. Вам не нужно менять все свои int
s на long
(если int
- 32 бит, а long
- 64 бит) или от int32_t
до int64_t
. (если вы спрашиваете себя, почему 43 бит, скажем, что Windows Server 2008 R2 64bit не поддерживает объекты размером 2^63 или объекты размером 2^62 ... Он поддерживает адресного пространства ... Итак, 43 бит!)
Многие программы, написанные для Windows, считали, что указатель будет таким большим, как DWORD
(32-разрядное целое число без знака). Эти программы не могут быть перекомпилированы на 64-битной основе без перезаписи больших кодов кода. Если бы они использовали DWORD_PTR
(значение без знака гарантировалось настолько большим, сколько необходимо, чтобы содержать указатель), у них не было бы этой проблемы.
size_t
"Точка" аналогична. но другой!
size_t
не гарантирует попадание в список указателя!
(DWORD_PTR
из Microsoft Windows есть)
Это, в общем, является незаконным:
void *p = ...
size_t p2 = (size_t)p;
Например, на старой "платформы" DOS, максимальный размер объекта был 64k, так что size_t
должен был быть 16 бит BUT Долгий указатель должен был быть как минимум 20 бит, потому что у 8086 было пространство памяти 1 мб (в конце дальний указатель был 16 + 16 бит, потому что память 8086 сегментированы)
Также смотрите [этот ответ] (http://stackoverflow.com/questions/131803/unsigned-int-vs-size-t/131833#131833) [этого вопроса] (http: // stackoverflow .com/q/131803/27615) для отличного объяснения. – razlebe