Учитывая вспомогательный метод, который выполняет некоторые битовые манипуляции и который иногда используется во время выполнения, а иногда в качестве аргумента 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);
...