Оптимизирован ли strlen для строковых литералов? - PullRequest
0 голосов
/ 08 мая 2018

Так скажи, что у меня есть это:

const auto foo = "lorem ipsum"

Если я использую strlen(foo) в своем коде, найдены ли 11 во время выполнения или они введены во время компиляции?

Ответы [ 3 ]

0 голосов
/ 08 мая 2018

Ответ зависит от компилятора и текущего уровня оптимизации.

Быстрый эксперимент с этим кодом C ++

#include <cstring>
int strlen_of_const() {
    return strlen("lorem ipsum");
}

on проводник компилятора показывает, что некоторые компиляторы оптимизируют вызов, в то время как другие компиляторы выполняют вызов во время выполнения. Например, gcc оптимизирует вызов:

strlen_of_const():
  mov eax, 11
  ret

MSVC, с другой стороны, сохраняет вызов:

$SG3533 DB        'lorem ipsum', 00H
EXTRN   strlen:PROC
strlen_of_const PROC
        sub      rsp, 40              ; 00000028H
        lea      rcx, OFFSET FLAT:$SG3533
        call     strlen
        add      rsp, 40              ; 00000028H
        ret      0
strlen_of_const ENDP
0 голосов
/ 08 мая 2018

Стандарт не позволяет реализациям добавлять constexpr, кроме случаев, когда это явно требуется:

[constexpr.functions]
Этот документ явно требует, чтобы определенные стандартные библиотечные функции были constexpr ([dcl.constexpr]). Реализация не должна объявлять какую-либо сигнатуру стандартной библиотечной функции в качестве constexpr, за исключением тех случаев, когда это явно требуется.

Так что strlen выходит за пределы.

Однако для поддержки constexpr конструкторов string_view стандарт C ++ 17 требует, чтобы определенные члены char_traits, такие как char_traits::length, в любом случае были constexpr.

И в этом месяце у нас были новые выпуски компиляторов gcc 8.1 и MSVC 15.7 , так что все последние версии основных компиляторов теперь реализуют char_traits::length как constexpr.

0 голосов
/ 08 мая 2018

Это полностью зависит от вашего компилятора и от того, строите вы или нет с включенной оптимизацией.

Хороший современный компилятор, вероятно, оптимизирует strlen и выдаст 11 как константу при оптимизации, но ничто в языке не заставляет его это делать. Так что компилятор также вполне может сгенерировать вызов функции.

Вам просто нужно протестировать с выбранным компилятором на выбранном вами уровне оптимизации и прочитать сгенерированную сборку.

...