c++11 - What is the function parameter equivalent of constexpr? -


we trying speedup code under clang , visual c++ (gcc , icc ok). thought use constexpr tell clang value compile time constant causing compile error:

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

here reduced case:

$ 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 right thing. recognize value 2 in expression rightrotate(argc, 2) cannot change under laws of physical universe know them, , treat 2 compile time constant , propagate assembly code.

if remove constexpr, clang , vc++ aseembles function rotate register, 3x slower rotate immediate.

how tell clang function parameter rotate compile time constant, , should assembled rotate immediate rather rotate register?

you use non-type template arguments this:

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

you'd invoke as

rightrotate<137>(argument); // rotate 137 here 

Comments