2011-10-21 2 views
10

Название на самом деле немного вводит в заблуждение, но я хотел бы держать его коротким. Я читал о том, почему я должен использовать size_t и я часто такие заявления:Почему size_t лучше?

size_t гарантированно будет в состоянии выразить максимальный размер любого объекта, в том числе любого массива

Я надеваю Я действительно понимаю, что это значит. Есть ли какие-то ограничения на объем памяти, который вы можете выделить сразу, и размер size_t гарантированно будет достаточно большим, чтобы подсчитывать каждый байт в этом блоке памяти?

последующий вопрос:
What determines how much memory can be allocated?

+0

Также смотрите [этот ответ] (http://stackoverflow.com/questions/131803/unsigned-int-vs-size-t/131833#131833) [этого вопроса] (http: // stackoverflow .com/q/131803/27615) для отличного объяснения. – razlebe

ответ

9

Скажем, самый большой объект, который может иметь ваш компилятор/платформа, составляет 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 сегментированы)

+0

Значит, это максимально возможный целочисленный тип на данной платформе? –

+3

@Paul No. У вас все еще может быть 128-битное целое число. Но если 'size_t' - 64 бита, а' long' - 128 бит (это законно, но я не думаю, что есть компиляторы с 128-битным 'long'), вы все равно не можете' malloc (2^120) ' – xanatos

+0

Спасибо , Я разместил следующий вопрос здесь: http://stackoverflow.com/questions/7850482/what-determines-how-much-memory-can-be-allocated –

2

size_t определяется для платформы, что вы компилируете для. Следовательно, он может представлять максимум для этой платформы.

+0

Максимум из чего? –

+0

Paul - см. Http://en.wikipedia.org/wiki/Size_t и т. Д. Google it! –

-1
+0

ответ с помощью только ссылки на Википедию довольно глупый. – akappa

+0

Ну, это прекрасно отвечает на вопрос. Может быть, вопрос, на который легко ответить Google, также довольно глупый? Но нет глупых вопросов, не так ли? –

+0

@cli_hlt Кандидат глупый вопрос: «Являются ли ядерные осадки вредом для моей коллекции видеоленты?» ;-) – chux

6

В основном это означает, что size_t, гарантированно будет достаточно большим, чтобы индексировать любой массив и получить размер любого типа данных.

Предпочтительно использовать только int, поскольку размер int и других целых типов может быть меньше, чем то, что может быть проиндексировано. Например, int обычно составляет 32 бита, что недостаточно для индексации больших массивов на 64-битных машинах. (Это очень распространенная проблема при переносе программ на 64-разрядные.)

2

size_t - это возврат оператора sizeof (см. 7.17 c99), поэтому он должен описывать максимально возможный объект, который может представлять система.

3

Именно по этой причине. Максимальный размер любого объекта в данном языке программирования определяется комбинацией ОС, архитектуры ЦП и используемого компилятора/компоновщика.

size_t определяется как достаточно большой, чтобы удерживать значение размера максимально возможного объекта.

Это обычно означает, что size_t typedef'ed должен быть таким же, как и самый большой доступный тип int. Так что в 32-битной среде обычно будет 4 байта, а в 64-битной системе - 8 байтов.

Смежные вопросы