Pull to refresh
2
0
Send message
Вызов функции strlen для того, чтобы узнать, является ли строка непустой — это неэффективный способ. Такую проверку можно произвести гораздо проще: if (*key[0] != '\0'), и не нужно будет проходить по всем элементам строки, если она непустая.

Любой state-of-the-art компилятор производит встраивание str*/mem* функций стандартной библиотеки (хотя это не совсем законно), и сделает эту оптимизацию самостоятельно, что позволяет оставить более читаемый код. https://godbolt.org/z/XWIlo3 (у MSVC традиционно есть некоторые проблемы)

Спасибо за статью. Жаль что тернистый путь constexpr еще далек от завершения. DR253 не упомянут по упущению?

Немного занудства. В 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 конструктором).

Information

Rating
Does not participate
Registered
Activity