gpt4 book ai didi

c++11 - constexpr 的函数参数等效项是什么?

转载 作者:行者123 更新时间:2023-12-02 04:06:21 28 4
gpt4 key购买 nike

我们正在尝试加速 Clang 和 Visual C++ 下的一些代码(GCC 和 ICC 也可以)。我们认为可以使用 constexpr告诉 Clang 一个值是一个编译时常量,但它会导致编译错误:

$ clang++ -g2 -O3 -std=c++11 test.cxx -o test.exe
test.cxx:11:46: error: function parameter cannot be constexpr
unsigned int RightRotate(unsigned int value, constexpr unsigned int rotate)
^
1 error generated.

这是简化的情况:

$ cat test.cxx
#include <iostream>

unsigned int RightRotate(unsigned int value, constexpr unsigned int rotate);

int main(int argc, char* argv[])
{
std::cout << "Rotated: " << RightRotate(argc, 2) << std::endl;
return 0;
}

unsigned int RightRotate(unsigned int value, constexpr unsigned int rotate)
{
// x = value; y = rotate
__asm__ ("rorl %1, %0" : "+mq" (value) : "I" ((unsigned char)rotate));
return value;
}

GCC 和 ICC 会做正确的事。他们识别像 2 这样的值在表达式 RightRotate(argc, 2) 中根据我们所知的物理宇宙定律,它无法改变,并且它将对待 2作为编译时常量并将其传播到汇编代码中。

如果我们删除constexpr ,然后 Clang 和 VC++ 将函数组装成 rotate REGISTER ,比 rotate IMMEDIATE 慢 3 倍.

我们如何告诉 Clang 函数参数 rotate是一个编译时常量,它应该被组装成 rotate IMMEDIATE而不是rotate REGISTER

最佳答案

您可以为此使用非类型模板参数:

template <unsigned int rotate> RightRotate(unsigned int value) {
...
}

然后您可以将其调用为

RightRotate<137>(argument); // rotate is 137 here

关于c++11 - constexpr 的函数参数等效项是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39284065/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com