2017-04-01 82 views
2

免责声明:这个问题有点复杂,因为它是一个问题,但它们都涉及到同一种概念/问题。C++编译器可以缓存constexpr函数的结果吗?

前提: consexpr功能可能仅由单个return声明。

它们可以调用其他函数和使用条件,但理论上它们应该展示功能的纯度,因此结果应该在某种映射中可以缓存(由编译器在编译时),这样编译器就没有不断重新评估相同的功能。

问题(S): 这是假设是正确的或者是有什么我还没有考虑,使得它不可能缓存constexpr函数的结果? 如果不是,这是否意味着每次使用函数时都必须计算constexpr函数?

template怎么样? template可以缓存的值是constexpr还是每次都必须重新计算?

+0

通常可以在编译时评估'consexpr'函数;这是练习的重点。在那种情况下,可执行代码最终只是通过评估函数调用的结果,而不是函数本身的代码。这是最终的缓存。或者你问编译器是否可以在编译时优化多个评估?可能,但我不知道你为什么在意。 –

+0

你为什么要在意?它对你的程序有什么不同? –

+0

@IgorTandetnik我的意思是编译器假定函数是纯粹的,使用映射缓存给定输入的结果,并从此开始查阅缓存(即映射),而不是不断重新评估函数? – Pharap

回答

1

我不相信constexpr功能必须是纯粹的 - 至少,不是所有可能的论点。考虑:

#include <iostream> 
#include <stdlib.h> 

constexpr int f(int n) { return n == 0 ? 42 : rand(); } 

template <int n> void g() {} 

int main() 
{ 
    g<f(0)>(); // OK 
// g<f(1)>(); // error 
    std::cout << f(0) << ' ' << f(1) << ' ' << f(2); 
} 

输出:42 1804289383 846930886Demo

+0

这是一些非常奇怪的行为。我很确定'rand'不是'constexpr',所以我觉得'constexpr'函数可以接受它是有效的。 – Pharap

+1

@Pharap绝对不要求constexpr函数只包含对其他constexpr函数的调用。 –

相关问题