strlen - довольно простая функция, и, очевидно, O (n) вычисляется. Тем не менее, я видел несколько подходов, которые работают более чем на одного персонажа за раз. См. Пример 5 здесь или этот подход здесь. Основным способом этой работы является реинтерпрет-литье буфера char const* в буфер uint32_t const*, а затем проверка по четыре байта за раз.
Лично моя реакция кишки заключается в том, что это ожидаемое segfault, потому что я могу разыменовать до трех байтов вне действительной памяти. Тем не менее, это решение, похоже, держится, и мне кажется любопытным, что что-то настолько явно сломанное выдержало испытание временем.
Я думаю, что это включает UB по двум причинам:
- Потенциальная развязка вне допустимой памяти
- Потенциальное разыменование неглавного указателя
( Обратите внимание, что проблема с псевдонимом отсутствует, можно подумать, что uint32_t псевдонимы как несовместимый тип и код после strlen (например, код, который может изменить строку) может выйти из строя до strlen, но оказывается, что char является явным исключением из строкового сглаживания).
Но, насколько вероятно, что это не удастся на практике? Как минимум, я думаю, что после строки данных строкового литерала должно быть 3 байтов, malloc должен быть 4 -байт или больше (фактически на самом деле в большинстве систем), а malloc необходимо выделить 3 дополнительные байты. Существуют другие критерии, связанные с псевдонимом. Все это прекрасно для реализаций компилятора, которые создают свои собственные среды, но как часто эти условия встречаются на современном оборудовании для кода пользователя?