小编Nei*_*son的帖子

在constexpr函数中有效调用_BitScanReverse或__builtin_clz的方法?

似乎_BitScanReverse,尽管是一个内在的而不是一个真正的函数,但是在Visual C++中的constexpr函数中无法调用它.我知道我可以用更慢的方式自己实现这个操作,这对于在编译时进行评估的情况很好,但不幸的是它不仅仅是1个时钟周期的单CPU指令(BSR)用于在运行时进行评估的情况.我还没有尝试过GCC/Clang中的__builtin_clz,但它可能会或可能不会出现同样的问题,我希望这些代码可以在主要的编译器中运行,(非GCC,非Clang的缓慢回退) ,非VC编译器).

想法/问题:

有一种简单的方法可以让函数在编译时进行评估时使用一个代码块,这样它可以是constexpr-safe,并且是一个不同的运行时代码块,因此它可以很快?(如果是这样,这也与我的其他一些问题有关.)

或者,有没有办法欺骗编译器能够为constexpr代码评估_BitScanReverse?

问题:

是否有任何计划最终将其添加到C++标准?他们添加了std :: log2和std :: ilogb,但这些都是通过浮点数,而不是只做一个BSR(或者是ARM芯片上的CLZ和减法).

c++ g++ intrinsics visual-c++ constexpr

7
推荐指数
1
解决办法
707
查看次数

平凡的默认构造函数不能是 constexpr 吗?

看起来 C++ 标准当前阻止普通默认构造函数成为 constexpr(如果有任何非静态成员变量),因为普通默认构造函数必须什么都不做,但 constexpr 构造函数必须初始化所有内容。不幸的是,这会阻止该类型成为 POD 类型。

是否有任何解决方法可以允许类类型具有可在 constexpr 代码中使用的默认构造函数,而不会使类成为非 POD?

我可以通过向构造函数添加一个冗余参数来解决这个问题,以便 constexpr 代码可以使用非默认构造函数,但这看起来很脏,尤其是因为在我关心的情况下,初始化值是不必要的,并且都将被写入-over 在后面的代码中,所以我更喜欢一个简单的默认构造函数。例如:

struct A {
    int a;

    // Non-default constructors necessitate an explicit default
    // constructor if default constructor is to exist
    constexpr A(int b) : a(b) {}

#if 1 // non-POD
    // constexpr default constructor must initialize everything,
    // but this makes A non-POD.
    constexpr A() : a(0) {}
#else // Workaround
    A() = default;
    struct UnnecessaryClass {};
    constexpr A(UnnecessaryClass) : a(0) {}
#endif
}; …
Run Code Online (Sandbox Code Playgroud)

c++ constructor constexpr

5
推荐指数
1
解决办法
1278
查看次数

标签 统计

c++ ×2

constexpr ×2

constructor ×1

g++ ×1

intrinsics ×1

visual-c++ ×1