Скажем, самый большой объект, который может иметь ваш компилятор / платформа, это 4 ГБ. size_t
тогда 32 бит. Теперь предположим, что вы перекомпилируете свою программу на 64-битной платформе, способной поддерживать объекты размером 2 ^ 43 - 1. size_t
будет иметь длину не менее 43 бит (но обычно это будет 64 бит на данный момент). Дело в том, что вам нужно только перекомпилировать программу. Вам не нужно менять все свои int
s на long
(если int
32-битный и long
64-битный) или с int32_t
на int64_t
.
(если вы спрашиваете себя, почему 43-разрядная версия, допустим, что 64-разрядная версия Windows Server 2008 R2 не поддерживает объекты размером 2 ^ 63 и объекты размером 2 ^ 62 ... Она поддерживает 8 ТБ адресуемой пробел ... Итак, 43 бит!)
Многие программы, написанные для Windows, считают указатель таким же большим, как DWORD
(32-разрядное целое число без знака). Эти программы не могут быть перекомпилированы на 64 бит без переписывания больших кусков кода. Если бы они использовали DWORD_PTR
(значение без знака, которое гарантированно должно быть настолько большим, насколько это необходимо для содержания указателя), у них не было бы этой проблемы.
«Точка» size_t
аналогична. но отличается !
size_t
не может содержать указатель !!
(DWORD_PTR
в Microsoft Windows есть)
Это, как правило, незаконно:
void *p = ...
size_t p2 = (size_t)p;
Например, на старой платформе DOS максимальный размер объекта составлял 64 КБ, поэтому size_t
должен был составлять 16 бит НО дальний указатель должен быть не менее 20 бит, потому что у 8086 было пространство памяти 1 мб (в конце дальний указатель был 16 + 16 бит, потому что память у 8086 была сегментирована)