对于我正在进行的项目,有许多州可以依赖计算来返回相同的结果(并且没有副作用)。显而易见的解决方案是对所有昂贵的功能使用memoization。
我需要有一个处理多个状态的memoization(这样我就可以使一个缓存集无效而不会使另一个缓存集失效)。对于这种事情,有人知道一个好的C库吗? (注意它不能是C ++,我们正在谈论C。)
我已经在Python中使用了一些很好的实现,它们使用装饰器来灵活地记忆一堆不同的功能。我有点想知道是否有一个通用库可以用C做类似的事情(尽管可能有明确的函数包装而不是方便的语法)。我认为,当一个常见的问题必须为它提供一些现成的解决方案时,必须单独为每个函数添加缓存是愚蠢的。
我要寻找的特征如下:
任何人都知道可以处理所有或大部分必需品的C实现吗?
答案 0 :(得分:10)
好的,因为没有用于C的记忆库,我正在寻找一个用于在代码库中记忆现有C函数的插件解决方案,我创建了自己的小备忘库,我将在APL 2.0下发布。希望人们会发现这很有用,它不会在其他编译器上崩溃和烧毁。如果确实有问题,请在此留言,每当我有时间时(我可能会以几个月的增量来衡量),我会调查它。
这个库不是为了速度而构建的,但它可以工作并且已经过测试,以确保它使用起来相当简单,并且在我的测试中不会显示任何内存泄漏。从根本上说,这让我可以添加memoization到类似于我在Python中习惯的装饰模式的函数。
该库目前在SourceForge上作为C-Memo Library。它附带了一个小的用户手册和几个第三方允许的许可库,用于通用散列。如果位置发生变化,我会尝试更新此链接。我发现这有助于我的项目工作,希望其他人会发现它对他们的项目有用。
答案 1 :(得分:1)
memoization除了内置于haskell语言之外。你可以call this functionality from c
更新:
我还在学习函数式编程,但我知道memoization在函数式编程中相当普遍,因为语言特性使它变得容易。我正在学习f#。我不知道haskell,但它是我所知道的唯一与c交互的功能语言。您可能能够以比haskell提供的更合适的方式找到与c接口的另一种函数式编程语言。
答案 2 :(得分:0)
为什么不能只是C ++?
仅以起点来看此记忆功能:
声明:
template<typename T, typename F>
auto Memoize(T key, F function) {
static T memory_key = key;
static auto memory = function(memory_key);
if (memory_key != key) {
memory_key = key;
memory = function(memory_key);
}
return memory;
}
用法示例:
auto index = Memoize(value, IndexByLetter);