Отключить реализацию, если метод используется в качестве constexpr? - PullRequest
2 голосов
/ 13 марта 2020

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

Я пытаюсь оптимизировать этот метод с помощью компилятора встроенные модули / встроенные функции (уже показанные в приведенном выше фрагменте).

Возможность использования встроенных функций в настройках constexpr, конечно, зависит от реализации. Из компиляторов / envs, на которые я нацеливаюсь, G CC 9.2 и clang 9.0 разрешают __builtin_clz() в constexpr, MSV C 14.1 (VS2017) - нет.

Есть ли способ, которым реализация моей функции могла бы определить, используется ли он в настройке constexpr (затем выполняется ручное управление битами) или во время выполнения (затем с использованием intrinsi c) компилятора?

, т. е.

    public: static inline constexpr unsigned char CountLeadingZeroBits(std::uint32_t value) {
    #if defined(_MSC_VER) && (!__method_used_as_constexpr)
      return __lzcnt(value);
    ...
...