Атрибуты функции GCC против кэширования - PullRequest
1 голос
/ 05 апреля 2009

У меня есть одна дорогостоящая функция, которая вызывается много раз, и существует очень ограниченный набор возможных значений параметра.
Код возврата функции зависит только от аргументов, поэтому очевидный способ ускорить процесс - сохранить статический кэш внутри функции для возможных аргументов и соответствующих кодов возврата, поэтому для каждой комбинации параметров дорогостоящая операция будет выполняться только один раз.
Я всегда использую этот подход в таких ситуациях, и он отлично работает, но мне просто пришло в голову, что атрибуты функции GCC const или pure, вероятно, могут помочь мне в этом.

У кого-нибудь есть опыт с этим? Как GCC использует атрибуты pure и const - только во время компиляции или во время выполнения?
Могу ли я рассчитывать на то, что GCC будет достаточно умен для вызова функции, объявленной как

int foo(int) __attribute__ ((pure))

только один раз для одного и того же значения параметра, или нет никакой гарантии, и мне лучше придерживаться подхода кеширования?

РЕДАКТИРОВАТЬ: Мой вопрос не о кэшировании / памятках / таблицах поиска, а об атрибутах функции GCC.

Ответы [ 4 ]

15 голосов
/ 05 апреля 2009

Я думаю, что вы путаете чистый атрибут GCC с памяткой .

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

То, что вы, похоже, ищете, - это запоминание вашей функции. Мемоизация - это оптимизация, при которой вычисления для одного и того же ввода не должны повторяться. Вместо этого должен быть возвращен предыдущий результат. Чистый атрибут GCC не заставляет функцию работать таким образом. Вам бы пришлось реализовать это вручную.

2 голосов
/ 05 апреля 2009

У меня есть одна дорогостоящая функция, которая вызывается много раз, и набор параметров для этого параметра очень ограничен.

Почему бы тогда не использовать статическую карту констант (аргументы 'можно хэшировать для генерации ключа, код возврата - значение)?

1 голос
/ 11 августа 2010

Мне не нравится открывать старые темы, но здесь был особенно оскорбительный комментарий:

"шаблоны предназначены для работы с разными типами, а не с разными значениями одного типа"

Теперь возьмем простой шаблон факториальной реализации:

template<int n> struct Factorial {
    static const int value = n * Factorial<n-1>::value;
};

template<> struct Factorial<0> {
    static const int value = 1;
};

Параметр шаблона здесь представляет собой целое число, а не имя типа.

1 голос
/ 05 апреля 2009

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

Оформить шаблон метапрограммирования . Концепции похожи на «запоминание», предложенное JaredPar, даже используя тот же вводный пример факториальной функции. Возможно, было бы уместно сказать, что эти типы шаблонов являются реализациями мемоизации во время компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...