【问题标题】:Calling MSVC builtin/intrinsics for C math functions为 C 数学函数调用 MSVC 内置/内在函数
【发布时间】:2012-01-15 17:13:56
【问题描述】:

对于 GCC 和 Clang,我可以轻松做到这一点:

    // absolute value
    inline constexpr int abs(const int number)
    { return __builtin_abs(number); }
    inline constexpr long abs(const long number)
    { return __builtin_labs(number); }
    inline constexpr long long abs(const long long number)
    { return __builtin_llabs(number); }
    inline constexpr double abs(const double& number)
    { return __builtin_fabs(number); }
    inline constexpr float abs(const float& number)
    { return __builtin_fabsf(number); }
    inline constexpr long double abs(const long double& number)
    { return __builtin_fabsl(number); }

这就像一个魅力。我想对几乎每个数学函数都做类似的事情,并且我的代码也可以在 MSVC 上运行。我怎样才能为 MSVC 做与上述相同的操作?

编辑:为了清楚起见:问题是关于 __builtin_* 函数,仅此而已。我试过了

#pragma intrinsic(abs)

但这需要一个 abs 函数的声明,我不想在我的全局命名空间中拥有它。

【问题讨论】:

  • 有一个响应链接到 MSVC 中可用的内在函数:stackoverflow.com/questions/355967/…
  • 你是问微软的编译器是否支持constexpr?答案是否定的,不适用于 Visual Studio 2010 或下一版本 VS 11。
  • IIRC 你甚至不需要这样做 - 我相信有一个编译器开关可以确定是否使用内置函数而不是库函数?

标签: c++ visual-c++ c++11 intrinsics built-in


【解决方案1】:

内部函数不可移植,因此您必须手动 look up the corresponding builtin function 并将其添加到列表中,并使用 #ifdef 切换模式。

顺便说一句,您不必在全局命名空间中包含abs:包括<cstdlib> 而不是<stdlib.h>you will get std::abs

编译器知道他们自己的内在函数是什么,MSVC 使用the /Oi switch 来启用它们。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 2010-11-06
    • 2012-01-12
    • 1970-01-01
    • 2023-01-04
    • 1970-01-01
    • 2017-12-06
    相关资源
    最近更新 更多