【发布时间】:2011-08-29 07:53:40
【问题描述】:
对于我正在从事的项目,有许多州可以依靠计算来返回相同的结果(并且没有副作用)。显而易见的解决方案是对所有代价高昂的功能使用记忆。
我需要有处理多个状态的记忆(这样我就可以使一个缓存集无效而不使另一个缓存集无效)。有人知道这类事情的好 C 库吗? (请注意,它不能是 C++,我们说的是 C。)
我在 Python 中使用过一些很好的实现,它们使用装饰器能够灵活地记忆一堆不同的函数。我有点想知道是否有一个通用库可以用 C 做类似的事情(尽管可能使用显式函数包装而不是方便的语法)。我只是认为,当这是一个足够常见的问题时,必须为每个函数单独添加缓存是愚蠢的,必须有一些现成的解决方案。
我要寻找的特征如下:
- 可以缓存各种输入输出的函数
- 管理多个不同的缓存(因此您可以拥有短期和长期缓存)
- 具有很好的使缓存失效的功能
- 旨在用于包装函数,而不是更改现有函数
有人知道可以处理所有或大部分这些必要条件的 C 实现吗?
【问题讨论】:
-
我不清楚这样的事情是如何工作的。像
memoize(void*func, void*returnVal, int return size, ...)这样的记忆包装器?显得复杂而脆弱。一堆预处理器骇客?你可以用这种东西做一些令人惊奇的事情,但它也往往很脆弱,可能成为维护的噩梦。但是,无论如何,这是个好问题。 -
在 C++11 中完美转发会更好,但我可以想象它在 C 中通过向
memoize()提供类型描述符字典来完成一些性能损失。和 printf() 一样脆弱。 -
@Namey:人们一直在用 C 做记忆,但是一个通用的 C 库——就 C++ 如何具有模板或 Python 装饰器如何包装它而言是“通用的”——是痛苦的并且充满了陷阱。
-
@Fred:我想我的看法不同。每次想要记住一个单独的功能时都必须重新发明轮子,这样的痛苦和陷阱是否会减少?我宁愿在一个地方维护一件痛苦的事情,而不是分散在代码中各处的 1000 个临时实现。
-
@Namey:我的意思是对于该库的每次使用都“痛苦且充满陷阱”。就编写时而言,与编写通用库相比,添加“内部”记忆(使用实现知识)非常简单。重复的成本低于替代品的成本,恕我直言。
标签: c memoization