c++ - 为 GCC 复制 clang 的 __builtin_assume

标签 c++ gcc compilation clang built-in

最近发现 void __builtin_assume(bool) 对于 clang,它可以向编译器提供有关程序状态的附加信息。这可以产生巨大的差异,例如 for example :

#include <cstddef>

// compiles to about 80 instructions at -O3
unsigned sum(unsigned data[], size_t count) {
    unsigned sum = 0;
    for (size_t i = 0; i < count; ++i) {
        sum += data[i];
    }
    return sum;
}

// compiles to about 10 instructions at -O3
unsigned sum_small(unsigned data[], size_t count) {
    __builtin_assume(count <= 4);
    unsigned sum = 0;
    for (size_t i = 0; i < count; ++i) {
        sum += data[i];
    }
    return sum;
}
我此时被迫使用 GCC,我很好奇是否存在等效的内置函数。不幸的是我找不到 __builtin_assumethe GCC documentation .也许存在一个内置但它只是有一个不同的名字?
如果不存在等效的内置函数,是否有办法在没有 __builtin_assume 的情况下产生相同的结果? ,例如当条件不成立时故意调用未定义的行为?
理想情况下,我想要一个始终可以安全调用的宏,例如:
#if ... // detect clang
#define MY_ASSUME(condition) __builtin_assume(condition)
#elif ... // detect GCC
#define MY_ASSUME(condition) __gcc_builtin_assume_equivalent(condition)
#else
#define MY_ASSUME(condition)
#endif
无论解决方案是什么,它也应该适用于 constexpr功能。

最佳答案

我用过 __builtin_unreachable() 这表明控制流到达这里是未定义的行为。您可以将其包装在 if 中基本上写一个断言。条件可以是任何不变量,即 false ,所以在你的情况下,你会提出相反的条件。
例子 :

// Basically `assert(count <= 4);`
if ( !(count <= 4) ) {
    __builtin_unreachable();
}
编辑:为了回应评论,您可以将其转换为这样的断言宏:
// Line break for readability
#define my_assert( condition ) \
    { if(!(condition)) __builtin_unreachable(); }
根据问题中的代码,您可以这样使用它:
unsigned sum_small(unsigned data[], size_t count) {
    my_assert(count <= 4); // <--- Changed here
    unsigned sum = 0;
    for (size_t i = 0; i < count; ++i) {
        sum += data[i];
    }
    return sum;
}

关于c++ - 为 GCC 复制 clang 的 __builtin_assume,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63493968/

相关文章:

c - log(10.0) 可以编译但 log(0.0) 不能使用 undefined reference ?

c++ - 为什么继承的 protected operator=() 具有公共(public)访问权限

我们可以使用 GCC 来处理 C 项目的翻译阶段 1..5

gcc - ARM + gcc : global destructors not called after main() returns, 但构造函数是

windows - 在 Windows 7 中设置 MinGW 以编译充分可移植的 C++ 代码

compilation - Agda 可以在批处理模式下更快地编译吗?

android - 在 Android Studio 中使用预构建的共享库

c++ - 一元仿函数可以有成员变量吗?

c++ - mfc 从另一个对话框更改一个对话框的光标

visual-studio - MS Visual Studio如何确定源文件已更改?