Какие плюсы и минусы у использования базового типа `int` в C++?

«Какие плюсы и минусы у использования базового типа `int` в C++?» — вопрос из категории C++ Core, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Плюсы типа int:

  • Эффективность и производительность. int обычно соответствует "естественному" или наиболее эффективному размеру целого числа для данной архитектуры процессора (часто 32 или 64 бита). Арифметические операции с int выполняются напрямую аппаратными инструкциями и, как правило, быстрее, чем с типами меньшего размера (которые могут требовать расширения знака) или большими типами.
  • Универсальность и широкая поддержка. Это фундаментальный, встроенный тип, используемый по умолчанию для целочисленных значений, возвращаемых многими стандартными функциями (например, strlen) и операторами (например, sizeof).
  • Простота использования. Не требует дополнительных объявлений или заголовочных файлов, в отличие от типов с фиксированным размером из <cstdint>.

Минусы и подводные камни типа int:

  1. Размер зависит от компилятора и целевой платформы (implementation-defined). Согласно стандарту, int должен быть как минимум 16 бит, но типичные размеры: 16 бит (микроконтроллеры), 32 бита (x86, x86_64), 64 бита (некоторые 64-битные системы). Это главный источник проблем с переносимостью.

    // Код, зависящий от размера int (плохая практика):
    int buffer_size = 65536; // Может быть проблемой, если int 16-битный (max 32767)
  2. Неопределённое поведение (UB) при переполнении со знаком. Арифметическое переполнение знакового целого числа (signed integer overflow) является неопределённым поведением в C/C++, что даёт компилятору право оптимизировать код, предполагая, что переполнения не происходит.

    int max_int = 2147483647; // Предположим, INT_MAX для 32-битного int
    max_int += 1; // Неопределённое поведение! Результат непредсказуем.
  3. Неоднозначность в интерфейсах. Использование int для параметров функций, которые должны представлять размер, индекс или флаги, может скрывать намерения. Более выразительными являются:

    • size_t для размеров и индексов (беззнаковый, гарантированно вмещает размер любого объекта).
    • Типы с фиксированным размером из <cstdint> (int32_t, uint64_t) для сериализации данных, сетевых протоколов или взаимодействия с внешними API.
    • Перечисления с явным указанием базового типа (enum class MyEnum : uint8_t).

Рекомендация: Используйте int для общих целей, когда производительность и естественность для процессора важны, а диапазон значений заведомо невелик (например, счётчики циклов). Для кода, требующего переносимости, точного контроля над размером или битовыми представлениями, предпочитайте типы из <cstdint>.