Кэширование функции в C

#c

#c

Вопрос:

Я знаком только с базовым C . Итак, не совсем уверен, что если мне задана функция, скажем f(a, b) , и мне нужно создать оболочку кэша поверх нее, как я это сделаю? Оболочка кэша вернет результаты из кэша, если они существуют, в противном случае поместите их туда как новую запись.

В Javascript я знаю, что мы можем сделать что-то в этом роде::

 function cached(f) {
    const cache = new Map();
    return function(...args) {
        const cacheKey = args.join(',');
        if (!cache.has(cacheKey)) {
            const value = f(...args);
            cache.set(cacheKey, value);
        }

        return cache.get(cacheKey);
    }
}
 

Итак, несколько вещей, которые мне нужно выяснить…

  1. Как я могу передать функцию другой функции в C или эмулировать что-то подобное.
  2. Оператор Spread ...args расширяет аргументы, чтобы они были доступны как записи на основе индекса. Не знаю эквивалента C того же.
  3. join операция формирует строку непосредственно из массива args — const cacheKey = args.join(',');

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

Комментарии:

1. Подсказка: std::map .

2. Вы можете попробовать поискать в Google «C memoization» и «C dynamic programming». Я не проверял, но я ожидаю хороших результатов.

3. Ребята, я знаю о map unordered_map или map в C . Я что-то упускаю из виду в части сложности? функция f — это внешний API, код которого я не могу изменить. Поэтому я должен создать оболочку, а не просто использовать map и запоминать ее. Сложность есть.

Ответ №1:

Как я могу передать функцию другой функции в C или эмулировать что-то подобное.

Существует несколько вариантов, включая передачу указателей на функции, объектов функций и т. Д.

Оператор Spread ...args расширяет аргументы, чтобы они были доступны как записи на основе индекса. Не знаю эквивалента C того же.

Переменные аргументы, пересылка и т. Д. Также Доступны в C с аналогичным синтаксисом.

join операция формирует строку непосредственно из массива args — const cacheKey = args.join(',');

В стандарте нет функции для этого, но ее довольно легко придумать. Существует также заголовок algorithms, который предоставляет вам общую версию этого, а также новые диапазоны C 20 для другого подхода к нему.

Комментарии:

1. Не могли бы вы, пожалуйста, расширить свой ответ примерами по этим пунктам?

2. @kushalvm рассмотрим std::function как простое решение для передачи функции.

3. @kushalvm Я боюсь, что это слишком широко для StackOverflow и будет повторять то, о чем говорят многие книги, статьи и даже другие вопросы. Пожалуйста, найдите термины, чтобы узнать больше.

4. Ммм … интересно, как запись кэшированной функции может быть широкой?

5. @kushalvm Вы просили » примеры по этим пунктам «. Это то, что является широким. Эти ответы дают вам названия многих понятий, которые вам нужно будет изучить, чтобы написать функцию-оболочку. StackOverflow не является сервисом для написания кода.