27

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

我需要有处理多个状态的记忆(这样我就可以使一个缓存集无效而不使另一个无效)。有人知道这类事情的好 C 库吗?(请注意,它不能是 C++,我们说的是 C。)

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

我要寻找的特征如下:

  1. 可以缓存具有各种输入和输出类型的函数
  2. 管理多个不同的缓存(因此您可以拥有短期和长期缓存)
  3. 具有很好的使缓存失效的功能
  4. 旨在通过包装函数使用,而不是更改现有函数

有人知道可以处理所有或大部分这些要求的 C 实现吗?

4

3 回答 3

11

好的,因为没有 C 的记忆库,并且我正在寻找一种在代码库中记忆现有 C 函数的嵌入式解决方案,所以我制作了自己的小型记忆库,我将在 APL 2.0 下发布。希望人们会发现这很有用,并且不会在其他编译器上崩溃和烧毁。如果确实有问题,请在此处给我发消息,我会在有时间的时候进行研究(可能以几个月为增量来衡量)。

这个库不是为了速度而构建的,但它可以工作并且已经过测试,以确保它使用起来相当简单,并且在我的测试中不会显示任何内存泄漏。从根本上说,这让我可以将记忆添加到类似于我在 Python 中习惯的装饰器模式的函数中。

该库目前作为C-Memo 库在 SourceForge 上。它带有一个小用户手册和几个用于通用散列的第 3 方许可库。如果位置发生变化,我会尝试更新此链接。我发现这对我的项目很有帮助,希望其他人会发现它对他们的项目有用。

于 2011-10-21T07:50:52.050 回答
1

memoization几乎是内置在 haskell 语言中的。您可以从 c 调用此功能

更新:
我仍在学习函数式编程,但我知道记忆化在函数式编程中相当普遍,因为语言特性使它变得简单。我正在学习 f#。我不知道haskell,但它是我所知道的唯一可以与c交互的函数式语言。您也许可以找到另一种函数式编程语言,它以比 haskell 提供的更合适的方式与 c 交互。

于 2011-05-22T03:47:59.783 回答
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);
于 2018-08-10T18:23:41.257 回答