C的记忆化库?

时间:2011-05-20 01:44:21

标签: c memoization

对于我正在进行的项目,有许多州可以依赖计算来返回相同的结果(并且没有副作用)。显而易见的解决方案是对所有昂贵的功能使用memoization。

我需要有一个处理多个状态的memoization(这样我就可以使一个缓存集无效而不会使另一个缓存集失效)。对于这种事情,有人知道一个好的C库吗? (注意它不能是C ++,我们正在谈论C。)

我已经在Python中使用了一些很好的实现,它们使用装饰器来灵活地记忆一堆不同的功能。我有点想知道是否有一个通用库可以用C做类似的事情(尽管可能有明确的函数包装而不是方便的语法)。我认为,当一个常见的问题必须为它提供一些现成的解决方案时,必须单独为每个函数添加缓存是愚蠢的。

我要寻找的特征如下:

  1. 可以使用各种类型的输入和输出缓存功能
  2. 管理多个不同的缓存(因此您可以进行短期和长期缓存)
  3. 具有使缓存无效的良好功能
  4. 旨在用于包装功能,而不是改变现有功能
  5. 任何人都知道可以处理所有或大部分必需品的C实现吗?

3 个答案:

答案 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);