Допустим, самый большой объект, который может иметь ваш компилятор/платформа, составляет 4 ГБ. size_t
тогда 32-битный. Теперь предположим, что вы перекомпилируете свою программу на 64-битной платформе, способной поддерживать объекты размером 2^43 - 1. size_t
будет иметь длину не менее 43 бит (но обычно на данный момент она будет 64-битной). Дело в том, что вам нужно только перекомпилировать программу. Вам не нужно менять все свои int
на 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 была сегментирована)
person
xanatos
schedule
21.10.2011