我有一个昂贵的函数被多次调用,并且参数的可能值集非常有限
函数返回代码仅依赖于参数,因此加快速度的明显方法是在函数中保留静态缓存以获取可能的参数和相应的返回码,因此对于参数的每个组合,昂贵的操作只执行一次。登记/>
我总是在这种情况下使用这种方法并且它工作正常但我刚刚意识到GCC函数属性const
或pure
可能可以帮助我解决这个问题。
有人有这方面的经验吗? GCC如何使用pure
和const
属性 - 仅在编译时或运行时?
我可以依靠GCC足够聪明地调用一个声明为
int foo(int) __attribute__ ((pure))
对于相同的参数值只有一次,或者没有任何保证,我最好坚持使用缓存方法?
编辑:我的问题不是关于缓存/记忆/查找表,而是GCC函数属性。
答案 0 :(得分:15)
我认为你将GCC纯属性与memoization混为一谈。
GCC纯属性允许编译器减少在某些情况下调用函数的次数(例如循环展开)。但是,只有在认为合适的情况下,它才能保证它会这样做。
您正在寻找的是您的功能的记忆。记忆是一种优化,不应重复相同输入的计算。而是应该返回先前的结果。 GCC纯属性不会使函数以这种方式工作。你必须亲自实现这一点。
答案 1 :(得分:2)
我有一个昂贵的函数被多次调用,并且参数的可能值集非常有限。
为什么不使用静态常量映射(可以对参数'进行散列以生成密钥,返回代码为值)?
答案 2 :(得分:1)
这听起来好像可以通过模板功能解决。如果所有已知参数和返回值都是在编译时已知的,则可以为每个可能的参数生成函数的模板实例。基本上,您将为每个可能的参数调用函数的不同实例。不确定它是否比您已经实现的静态缓存更容易,但可能值得探索。
结帐template metaprogramming。这些概念类似于JaredPar建议的“memoization”,甚至使用了与析因函数相同的介绍性示例。可能适当的说这些类型的模板是memoization的编译时实现。
答案 3 :(得分:1)
我不想重新打开旧线程,但这里有一个特别令人反感的评论:
“模板用于处理不同类型,而不是相同类型的不同值”
现在,采用简单的模板因子实现:
template<int n> struct Factorial {
static const int value = n * Factorial<n-1>::value;
};
template<> struct Factorial<0> {
static const int value = 1;
};
这里的模板参数是整数,而不是类型名。