Почему size_t используется для индексации / представления размера массива? - PullRequest
2 голосов
/ 14 января 2020

Согласно C ++ - нужно ли size_t с обычным массивом?

§ 18.2 6 Тип size_t является целочисленным типом целочисленного типа без знака, который достаточно большой, чтобы содержать размер в байтах любого объекта.

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

Например:

int array[1000];

for (size_t i = 0; i < 1000; ++i) {

}

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

Ответы [ 2 ]

3 голосов
/ 14 января 2020

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

Массив с большим размером, чем этот просто не разрешено языком.

3 голосов
/ 14 января 2020

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

. Учитывайте:

int array[1000];

for (uint8_t i; i < 1000; ++i) {}

Это явно неверно, у uint8 нет диапазона для индексировать этот массив. size_t всегда гарантирует стандарт.

Что касается байтов, то использование sizeof array дает размер байта. Должен быть гарантированный тип, чтобы иметь возможность представлять результат.

Я думаю, было бы более технически целесообразно использовать ptrdiff_t для индексации массивов, потому что именно этот тип индекса массива является : *(array+index). Но это не так часто, я думаю, это выглядит уродливее, дольше печатать и может сбивать с толку.

Обратите внимание, что стандарт C ++ не дает никаких аналогичных гарантий ни для какого другого типа. Но эта проблема диапазона является несколько теоретической в ​​большинстве практических случаев, так как вы можете быть уверены, что 64-разрядное целое число также может индексировать все, что умещается в памяти. Это более важно для сообщения намерений.

...