Быстро догадайтесь, какими будут sizeof(str) и strlen(str) константной строки в C? Будет ли strlen вычисляться во время выполнения или во время компиляции?

В ПОРЯДКЕ; читать дальше.

Компилятор C хранит строковые константы с ограничителем null, даже если он не определен вами в коде. Следовательно, оператор sizeof для строки доступен во время выполнения и возвращает фактическое количество символов плюс 1.

Компилятор C даже с отключенной базовой оптимизацией знает длину строки во время компиляции. Следовательно, даже если у вас есть функция strlen, вызываемая для константной строки в самой узкой части цикла, она все равно вычисляется один раз во время компиляции.

Чтобы увидеть это в действии — зайдите в Compiler Explorer по адресу https://godbolt.org/ и напишите тестовый код. Вот ссылка на пример кода с уже заполненным — https://godbolt.org/g/9oFLA3

Если вы пройдете дизассемблирование, то заметите, что текстовая часть нигде не содержит константной строки, так как ее присутствие не обязательно. Также обратите внимание, что в регистр esi загружаются значения 5 и 6 для операторов strlen и sizeof соответственно.

Так что продолжайте использовать функцию strlen для константных строк, не беспокоясь о потере производительности.

Кстати, никогда не используйте оператор sizeof для строкового указателя — он всегда будет возвращать размер указателя.