Вызов функции strlen для того, чтобы узнать, является ли строка непустой — это неэффективный способ. Такую проверку можно произвести гораздо проще: if (*key[0] != '\0'), и не нужно будет проходить по всем элементам строки, если она непустая.
Любой state-of-the-art компилятор производит встраивание str*/mem* функций стандартной библиотеки (хотя это не совсем законно), и сделает эту оптимизацию самостоятельно, что позволяет оставить более читаемый код. https://godbolt.org/z/XWIlo3 (у MSVC традиционно есть некоторые проблемы)
Немного занудства. В C++ констант нет, есть литералы, которые в C действительно называются константами. Спецификатор const это всего лишь контракт, за нарушение которого полагается undefined behavior. Компилятор, пользуясь этим неопределенным поведением, кладет эту переменную в ROM, но может и не положить, в том числе потому что есть легальные способы изменить const-qualified объект, например в деструкторе.
Одна оговорка — стандарт не гарантирует размещения переменной в ROM. Есть гарантия что произойдет константная инициализация если статическая переменная (variable with static storage duration) инициализируется константным выражением (в C++20 можно проверить с помощью std::is_constant_evaluated()), но разницы в инициализации между static const Test test и static Test test нет с точки зрения стандарта. Усложняет ситуацию дефект языка CWG 2026, который был устранен лишь недавно, и баги в компиляторах (MSVC до сих пор не производит константную инициализацию constexpr конструктором).
Любой state-of-the-art компилятор производит встраивание
str*
/mem*
функций стандартной библиотеки (хотя это не совсем законно), и сделает эту оптимизацию самостоятельно, что позволяет оставить более читаемый код. https://godbolt.org/z/XWIlo3 (у MSVC традиционно есть некоторые проблемы)Спасибо за статью. Жаль что тернистый путь
constexpr
еще далек от завершения. DR253 не упомянут по упущению?Конструктором, деструктором, а так же любым способом его
mutable
поля.Немного занудства. В C++ констант нет, есть литералы, которые в C действительно называются константами. Спецификатор
const
это всего лишь контракт, за нарушение которого полагается undefined behavior. Компилятор, пользуясь этим неопределенным поведением, кладет эту переменную в ROM, но может и не положить, в том числе потому что есть легальные способы изменить const-qualified объект, например в деструкторе.Одна оговорка — стандарт не гарантирует размещения переменной в ROM. Есть гарантия что произойдет константная инициализация если статическая переменная (variable with static storage duration) инициализируется константным выражением (в C++20 можно проверить с помощью
std::is_constant_evaluated()
), но разницы в инициализации междуstatic const Test test
иstatic Test test
нет с точки зрения стандарта. Усложняет ситуацию дефект языка CWG 2026, который был устранен лишь недавно, и баги в компиляторах (MSVC до сих пор не производит константную инициализацию constexpr конструктором).