переменный масштаб итерации для size_t - PullRequest
0 голосов
/ 26 мая 2018

С данным size_t, какой тип данных лучше всего подходит для итерации?

void do_some_for(size_t);

Когда я использую int,

void do_some_for(size_t const size) {
    for (int i = 0; i < size; i++) {
    }
}

Добрый компиляторпредупреждает меня вот так.

....c:36:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int i = 0; i < s; i++) {
                     ^

И установка unsigned перед int сбрасывает предупреждение.

void do_some_for(size_t const size) {
    for (unsigned int i = 0; i < size; i++) {
    }
}

Теперь мой вопрос: какой тип данных (лучший) дляиспользовать?

Я вижу, stdint.h#SIZE_MAX печатает это,

18446744073709551615 // at least 16 bits, i know.

, что явно равно 2^63 -1.

Должен ли я использовать unsigned long long int (C99) для этого?Или есть какой-нибудь динамичный способ сделать это?

1 Ответ

0 голосов
/ 26 мая 2018

Должен ли я использовать unsigned long long int для этого?

Вы не можете знать, не так ли?Вам может понадобиться 32 бита;вам может понадобиться 64 бита.(На действительно старой машине вам может потребоваться только 16 бит.)

Или есть какой-нибудь динамический способ сделать это?

Есть!В каждой системе есть специальный тип со специфичным для системы определением, который гарантированно будет:

  • без знака
  • соответствующего размера для хранения размера любого объекта, которыйвы можете манипулировать в этой системе

И имя этого типа, конечно, size_t.

Поэтому вы должны написать

void do_some_for(size_t size) {
    for (size_t i = 0; i < size; i++) {
        ...
    }
}

ис тобой должно быть все в порядке.

...