相关疑难解决方法(0)

什么时候constexpr函数在编译时得到评估?

由于在运行时可能会调用声明为constexpr的函数,编译器在哪个条件下决定是在编译时还是在运行时计算它?

template<typename base_t, typename expo_t>
constexpr base_t POW(base_t base, expo_t expo)
{
    return (expo != 0 )? base * POW(base, expo -1) : 1;
}

int main(int argc, char** argv)
{
    int i = 0;
    std::cin >> i;

    std::cout << POW(i, 2) << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我在编译时是未知的,这可能是编译器将POW()视为在运行时调用的常规函数​​的原因.然而,这种动态虽然看起来很方便,但却具有一些不切实际的含义.例如,是否有一种情况我希望编译器在编译时计算constexpr函数,编译器决定将其视为普通函数,而它在编译时也会工作?有任何已知的常见陷阱吗?

c++ runtime compile-time constexpr c++11

58
推荐指数
2
解决办法
1万
查看次数

用于编译时强制 constexpr 函数评估的单表达式助手可能吗?

@cyberpunk_试图实现一些目标,并提出了一些问题,但所有的追逐都归结为:

是否可以构建一个工具来强制执行constexpr函数的编译时评估?

int f(int i) {return i;}
constexpr int g(int i) {return i;}

int main()
{
    f(at_compilation(g, 0));
    int x = at_compilation(g, 1);
    constexpr int y = at_compilation(g, 2);
}
Run Code Online (Sandbox Code Playgroud)

在所有情况下,at_compilation强制执行g.

at_compilation不需要采用这种形式。

要求

  • 允许任何(数字本机)文字类型作为 constexpr 函数的输入。
    • 这也可以根据函数参数类型进行硬编码。
  • 允许任何(数字本机)文字类型作为输出,这是 constexpr 函数调用的结果。
    • 这也可以根据函数返回类型进行硬编码。

理想者

  • 减少宏的使用,但不要害怕使用。
  • 是通用的(不是硬编码的类型)。
  • 支持任何文字类型。最后,任何数字本机文字类型都是必需的。

相关问题:

  1. constexpr 函数何时在编译时进行求值?
  2. 强制在编译时计算常量表达式?
  3. 将任何函数作为模板参数传递?
  4. C++11 标准中的哪个位置指定了何时可以在翻译过程中计算 constexpr 函数?

相关代码示例的答案:

  • 1
  • 2
  • 3(这个有一个说明性的AT_COMPILATION宏)

所有代码示例都有关于要求的限制。

清楚地解释这在 C++ 中如何不可行也是一个很好的答案。

我怀疑这是不可能的,基于@K-ballo / @Herb Sutter 的 回答 …

c++ macros variadic-templates constexpr c++11

5
推荐指数
1
解决办法
3154
查看次数

constexpr在运行时表现更差

我编写了以下代码来测试constexpr析因与正常方式评估所用的时间

#include<iostream>
#include<chrono>

constexpr long int factorialC(long int x){  return x*(x <2?1 : factorialC(x-1));}
using ns = std::chrono::nanoseconds;
using get_time = std::chrono::steady_clock;
void factorial(long int x){
    long int suma=1;
    for(long int i=1; i<=x;i++)
    {
        suma=suma*i;

    }
    std::cout<<suma<<std::endl;
}

int main(){
    long int x = 13;

    std::cout<<"Now calling the constexpr"<<std::endl;
    auto start1 = get_time::now();
    std::cout<<factorialC(x)<<std::endl;
    auto end1 = get_time::now();

    std::cout<<"Now calling the normal"<<std::endl;
    auto start2 = get_time::now();
    factorial(x);
    auto end2 = get_time::now();
    std::cout<<"Elapsed time for constexpr is "<<std::chrono::duration_cast<ns>(end1-start1).count()
    <<" Elapsed time …
Run Code Online (Sandbox Code Playgroud)

c++ performance constexpr c++11

4
推荐指数
1
解决办法
839
查看次数

将任何函数作为模板参数传递?

我正在寻找一种方法将通用(constexpr,显然)功能传递给模板.它必须能够在不使用lambda的情况下获取任何数量的参数.这是我到目前为止:

template<typename T, T(*FUNC)()> struct CALL
{
    static inline constexpr decltype(FUNC()) EXEC()
    {
        return FUNC();
    }
};
Run Code Online (Sandbox Code Playgroud)

但是,只有传递的函数不带参数时才有效.有没有办法让模板接受任何constexpr功能?传递std ::函数似乎不起作用.我想关键是可变参数模板参数,但我不知道在这种情况下如何利用它们.

c++ templates function-pointers variadic-templates c++11

2
推荐指数
1
解决办法
946
查看次数