gpt4 book ai didi

c++ - constexpr 与模板、pow 函数

转载 作者:可可西里 更新时间:2023-11-01 16:21:26 25 4
gpt4 key购买 nike

我正在试验 c++11 的新特性,尤其是 constexpr。如果我想用模板编写一个 pow,我会简单地做:

//pow
template<class T, std::size_t n>
struct helper_pow{
inline static T pow(T const& a){
return a*helper_pow<T,n-1>::pow(a);
}
};

//final specialization pow
template<class T>
struct helper_pow<T,0>{
inline static T pow(T const& a){
return 1;
}
};

现在,如果我通过以下方式将我的函数调用到我的代码中:

pow<double,5>(a) // where a is double

对应的程序集将是(gcc 4.8.0,-O2):

   movapd  %xmm0, %xmm1
movsd %xmm0, 24(%rsp)
mulsd %xmm0, %xmm1
movq %rbx, %rdi
mulsd %xmm0, %xmm1
mulsd %xmm0, %xmm1
mulsd %xmm0, %xmm1

很好,代码是内联的。

如果知道我正在寻找 constexpr 版本,我有

template <class T>
inline constexpr T pow(T const& x, std::size_t n){
return n>0 ? x*pow(x,n-1):1;
}

现在对应的程序集是:

    movsd   24(%rsp), %xmm2
leaq 24(%rsp), %rdi
movl $4, %esi
movsd %xmm2, 8(%rsp)
call __Z3powIdET_RS0_m

函数 __Z#powIdET_RS0_m 似乎定义为

LCFI1:
mulsd %xmm1, %xmm0
movapd %xmm0, %xmm2
mulsd %xmm1, %xmm2
mulsd %xmm2, %xmm1
movapd %xmm1, %xmm0
ret

那么您是否知道为什么使用 constexpr 函数不是内联的并被视为“外部”函数?是否存在强制内联 constexpr 函数的方法?最好的。

最佳答案

inline 只不过是对编译器的提示。它可以做任何它喜欢做的事。它存在特定于编译器的内容,例如 pragmas 和 __declspec 以强制打开或关闭函数的内联。

可能是 constexpr 版本的非 const 左值引用干扰。无论如何,您应该按值传递给 pow。

关于c++ - constexpr 与模板、pow 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18334164/

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