Оптимизация C++: строки или перечислимый тип? | OTUS
🔥 Начинаем BLACK FRIDAY!
Максимальная скидка -25% на всё. Успейте начать обучение по самой выгодной цене.
Выбрать курс

Курсы

Программирование
iOS Developer. Basic
-25%
Python Developer. Professional
-25%
Разработчик на Spring Framework
-25%
Golang Developer. Professional
-25%
Python Developer. Basic
-25%
iOS Developer. Professional
-25%
Highload Architect
-25%
JavaScript Developer. Basic
-25%
Kotlin Backend Developer
-25%
JavaScript Developer. Professional
-25%
Android Developer. Basic
-25%
Unity Game Developer. Basic
-25%
Разработчик C#
-25%
Программист С Web-разработчик на Python Алгоритмы и структуры данных Framework Laravel PostgreSQL Reverse-Engineering. Professional CI/CD Vue.js разработчик VOIP инженер Программист 1С Flutter Mobile Developer Супер - интенсив по Kubernetes Symfony Framework Advanced Fullstack JavaScript developer Супер-интенсив "Azure для разработчиков"
Инфраструктура
Мониторинг и логирование: Zabbix, Prometheus, ELK
-25%
DevOps практики и инструменты
-25%
Архитектор сетей
-25%
Инфраструктурная платформа на основе Kubernetes
-25%
Супер-интенсив «IaC Ansible»
-16%
Разработчик программных роботов (RPA) на базе UiPath и PIX
-25%
Administrator Linux. Professional MS SQL Server Developer Безопасность Linux PostgreSQL Reverse-Engineering. Professional CI/CD VOIP инженер Супер-практикум по работе с протоколом BGP Супер - интенсив по паттернам проектирования Супер - интенсив по Kubernetes Administrator Linux.Basic Супер-интенсив «ELK»
Специализации Курсы в разработке Подготовительные курсы
+7 499 938-92-02

Оптимизация C++: строки или перечислимый тип?

Иногда в качестве входных данных разрешается применение фиксированного набора строк. Далее они хранятся и используются. Однако эти строки желательно конвертировать в перечислимый тип — это будет наилучшим вариантом. Почему? Давайте рассмотрим преимущества.

Сравнения и опечатки

Строки могут содержать практически любые последовательности символов, в том числе и бессмысленные. И если где-нибудь в сравнении допустили опечатку, найти её станет непростой задачей. А вот перечислимые типы, напротив, являются идентификаторами, поэтому компилятор пожалуется на несоответствие.

В качестве примера давайте рассмотрим небольшую функцию:

void printMessage(string const& msg, string const& messageType) {
  if (messageType == "waring") {
    std::cout << "WARN: "; //!
  }
  //...
}

Помеченная строка в нашем примере никогда не будет достигнута, так как messageType никогда не станет равен "waring". Это опечатка, которая сделана намеренно. Но если бы она была случайной, пришлось бы тратить время на отладку. А если бы мы использовали перечислимый тип, IDE и компилятор указали бы на ошибку сразу.

Соответствие типов

Вызовем предыдущую функцию:

printMessage("error", "Something bad happened!");

Ой… Мы только что пытались напечатать сообщение типа "Something bad happened!" с текстом "error". Но если бы тип сообщения был перечислимым, этой проблемы бы не возникло.

По большему счёту, желательно обернуть сообщения в их собственный класс либо структуру, ведь во многих случаях мы будем передавать и использовать тип и текст вместе.

Switch/case

В языке программирования C++ мы не можем использовать строки в условном операторе switch. В результате, вместо этого, нам приходится нагромождать if/else. А вот enum’ы — можем! Вдобавок к этому, мы сможем получать предупреждения компилятора либо статического анализатора, если забудем про перечислимый тип.

Производительность

Исключительно за производительностью гнаться не стоит. Однако в нашей ситуации, кроме производительности, мы ещё получим и более поддерживаемый код, а значит, стоит разобраться в вопросе чуть подробнее.

Стоит отметить, что сравнения перечислимых типов, как правило, быстрее, чем сравнения строк. При этом размер перечислимого типа равен размеру целого типа, а строки бывают весьма большими. Также оператор switch можно транслировать в jump-таблицы, что бывает эффективнее if/else.

Да, перечислимые типы совсем не обязательно более производительны, чем строки. Но всё же они явно не хуже.

Вывод прост: если у вас есть фиксированный набор строк, применяемый в качестве входных либо выходных данных, его однозначно надо конвертировать в enum.

По материалам статьи «Strings vs. Enumerators».

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться
🎁 Максимальная скидка!
Черная пятница уже в OTUS! Скидка -25% на всё!