Задать вопрос
Lite_stream
@Lite_stream

Существует ли тенденция избегать size_t, если это возможно?

Всем привет
Существует ли тенденция избегать size_t из-за того, что он является беззнаковым, например, чтобы не попасть на неожиданные signed/unsigned promotion'ы или остатки по модулю 2^N ?

Имея что-то вроде
template<typename T>
inline T static_cast_size_t(size_t value)
{
    #ifdef DEBUG
    if (value > std::numeric_limits<T>::max())
    {
        ASSERT(false);
    }
    return static_cast<T>(value);
    #else
    return static_cast<T>(value);
    #endif
}

// ....
// ....
// ....

// Применять как-то так:
int exampleNum = static_cast_size_t<int/*Или int_fast32, главное, что знаковый*/>(vector.size());
// ...
int numThatCanBeNegative = static_cast_size_t<int/*Или int_fast32, главное, что знаковый*/>(sizeof(U)) - someValue;
// ...


К сожалению, не нашёл guideline'ов ни по поводу size_t, ни int*_t, ни int_fast*
  • Вопрос задан
  • 228 просмотров
Подписаться 1 Простой 6 комментариев
Решения вопроса 1
gbg
@gbg Куратор тега C++
Любые ответы на любые вопросы
Если есть риск присванивания знакового значения в беззнаковое, компилятор выдаст WARNING

Гораздо опаснее пихать всюду int, особенно в качестве индексов массивов и размеров. Потому что в какой-то момент кто-то захочет посчитать больше 2^31 штук объектов.

Выдержка из материала по ссылке:
большое количество диагностических сообщений, выдаваемых анализатором Viva64, связанны именно с рекомендацией использования memsize-типов. Использование memsize типов (таких как size_t, ptrdiff_t, INT_PTR) в 64-битных программах, вместо 32-битных типов (int, unsigned) позволяет:

Построить компилятору более простой и, следовательно, более быстрый код, в котором будут отсутствовать лишние преобразования 32-битных и 64-битных данных. Особенно это полезно при работе с адресной арифметикой и индексации массивов.
Избежать ряда ошибок при обработке большого объема входных данных, когда количество обрабатываемых элементов превышает количество UINT_MAX.
Избежать ряда других, более специфичных ошибок.
Сделать код более переносимым между 64-битными Windows и Linux системами, в которых используются различные модели данных. Так, например, в Linux системах для индексации больших массивов можно использовать тип unsigned long, а в Windows нет.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы