Библиотеки Memoization для C? - PullRequest
26 голосов
/ 20 мая 2011

Для проекта, над которым я работаю, есть ряд состояний, в которых можно рассчитывать, чтобы получить одинаковые результаты (и не иметь побочных эффектов).Очевидное решение состоит в том, чтобы использовать памятку для всех дорогостоящих функций.

Мне нужно иметь памятку, которая обрабатывает более одного состояния (чтобы я мог сделать недействительным один набор кешей, не аннулировав другой).Кто-нибудь знает хорошую библиотеку C для такого рода вещей?(Обратите внимание, что это не может быть C ++, мы говорим о C.)

Я работал с некоторыми хорошими реализациями в Python, которые используют декораторы, чтобы иметь возможность гибко запоминать множество различных функций.Мне немного интересно, есть ли универсальная библиотека, которая могла бы делать подобные вещи с C (хотя, вероятно, с явным переносом функций, а не с удобным синтаксисом).Я просто думаю, что было бы глупо добавлять кеширование к каждой функции по отдельности, когда это достаточно распространенная проблема, для этого должны быть готовые решения.

Характеристики, которые я бы искал, следующие::

  1. Может кэшировать функции с различными типами ввода и вывода
  2. Управляет несколькими различными кэшами (так что вы можете иметь краткосрочное и долгосрочное кэширование)
  3. Имеетхорошие функции для аннулирования кэшей
  4. Предназначен для использования для переноса функций вместо изменения существующих функций

Кто-нибудь знает реализацию C, которая может обрабатывать все или большинство этих реквизитов?

Ответы [ 3 ]

10 голосов
/ 21 октября 2011

Хорошо, так как библиотек для C не было, и я искал встраиваемое решение для запоминания существующих функций C в базе кода, я создал свою собственную маленькую библиотеку, которую я выпускаю под APL 2.0. , Надеюсь, что люди найдут это полезным, и он не сработает и не сгорит на других компиляторах. Если у него есть проблемы, напишите мне здесь, и я буду изучать его всякий раз, когда у меня будет время (которое, вероятно, будет измеряться с шагом в месяцы).

Эта библиотека не создана для скорости, но она работает и была протестирована, чтобы убедиться, что она довольно проста в использовании и не показывает никаких утечек памяти в моем тестировании. По сути, это позволяет мне добавлять памятки к функциям, похожим на шаблон декоратора, к которому я привык в Python.

Библиотека в настоящее время находится на SourceForge как C-Memo Library . Он поставляется с небольшим руководством пользователя и парой сторонних лицензированных библиотек для общего хеширования. Если местоположение изменится, я постараюсь обновить эту ссылку. Я нашел это полезным при работе над моим проектом, надеюсь, другие найдут его полезным для своих проектов.

1 голос
/ 22 мая 2011

памятка почти встроена в язык хаскеля. Вы можете вызвать эту функцию из c

Обновление:
Я все еще изучаю функциональное программирование, но я знаю, что запоминание довольно распространено в функциональном программировании, потому что языковые функции облегчают его. Я учусь е #. Я не знаю haskell, но это единственный из известных мне функциональных языков, который будет взаимодействовать с c. Возможно, вам удастся найти другой функциональный язык программирования, который взаимодействует с c более подходящим способом, чем тот, который предоставляет haskell.

0 голосов
/ 10 августа 2018

Почему, просто не может быть 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);
...