Другие языки программирования и технологии

Давно интересует такой вопрос по плюсам

В языке си и си++ есть множество интегральных типов данных, ну взять к примеру беззнаковый size_t.
Используется в основном как счетчик для больших циклов.
Но как быть если сам счетчик фигурирует не только для указаний индексов, а для вычислений в самих выражениях.
К примеру цикл от 0 до 1000000 выполняет банальную аккумуляцию. пусть кумулятативная переменна будет unsigned int var, а счетчик size_t i, тогда выражение в цикле может иметь следующий вид:
var+=static_cast(i);
Как видно фигурирует дополнительное преобразование типа, что существенно снижает эффективность кода, по сравнению с тем, если бы был бы счетчик типа int.
В таком случае size_t целесообразнее заменить на тип int или саму переменную создать типа size_t.
Или логика здесь происходит от величины значений, так например если мы используем int или даже long то в типе size_t надобности никакой нет так как они в любом случае будут весить от 4 до 8 байт каждый и надо пользоваться size_t только при работе с типами long long???
Farid Fazilbekov
Farid Fazilbekov
10 755
Интегральный – это значит неразрывно связанный.
Интегрированный – это значит объединённый с чем-либо.

std::size_t – псевдоним для одного из фундаментальных целочисленных беззнаковых типов результата, возвращаемого операторами sizeof и alignof.

std::size_t может хранить максимальный размер теоретически возможного объекта любого типа (включая массивы). На большинстве платформ (за исключением систем с адресацией по сегментам) size_t может безопасно хранить значение любого указателя, кроме указателей на члены классов, таким образом, являясь синонимом std::uintptr_t.

std::size_t обычно используется для индексации массивов и счетчиков циклов. Программы, которые используют другие типы, например unsigned int, для индексации массивов, могут неправильно работать на, например, 64-битных системах, когда индекс превзойдет UINT_MAX или если он полагается на возможность переполнения 32-битного числа.

При индексации C++ контейнеров, таких как std::string, std::vector, и т. д. для индекса используется соответствующий тип, объявленный через typedef size_type в типе контейнера. Обычно этот тип определен как синоним std::size_t.
Георгий Резник
Георгий Резник
87 979
Лучший ответ
Farid Fazilbekov Я думал это целочисленный. Я читал определения, но вопрос заключается в другом.
Выберите вариант, наиболее удачный? В приоритете как всегда скорость и безопасность.
>> фигурирует дополнительное преобразование типа, что существенно снижает эффективность кода, по сравнению с тем, если бы был бы счетчик типа int.
Вовсе не обязательно.
Если у типов общий примитив, то типкаст между ними должен быть очень дешевым: ведь он фактически сводится к изменению свойства в таблице переменных (а значение не трогается). Например, если оба типа на примитиве DWORD, то кагбэ незачем его значение по памяти таскать: меняем логику обработки максимального разряда в выражениях (типа ставим переменной в таблице флаг "знаковое значение"), и все.

Ну, это "как должно быть". Как на самом деле - зависит от компилятора. Смотрите в отладчике генерируемый машинный код типкаста, если разбираетесь в асме...