Библиотеки Memoization для C?

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

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

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

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

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

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

3 ответа

Решение

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

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

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

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

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

Почему просто не может быть 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);
Другие вопросы по тегам