"Pure" (вид функций удовлетворяющих определенным требованиям, а не просто название флага) функции позволяют произвести оптимизацию за счет одного из видов кеширования, в зарубежной литераторе оно называется memoization (мемоизация). Основная идея состоит в том, чтобы не вызывать функцию повторно, если функция гарантирует одно и то же возвращаемое значение на определенные параметры. Если брать приведенный выше пример:
C++ (Qt)
int square (int) __attribute__ ((pure));
Эта функция вычисления корня. Как мы знаем, по меркам процессора, вычисление корня числа - дорогая/затратная/медленная операция. Если мы вычисляем корень из 4, то получаем 2. Сколько бы раз мы не вычисляли корень из четырех у нас всегда будет на выходе - 2. Поэтому руководствуясь методом кеширования (мемоизацией) мы просто сохраняем в некую таблицу - входной параметр и результат. И вместо того, чтобы в следующий раз вызывать вычисление корня над параметром 4 мы просто ищем этот параметр в таблице и возвращаем результат. Если этого параметра в таблице нет, то вызывается оригинальная функция.
Предположим такую задачу. У нас есть массив динамически сгенеренных чисел и мы должны вычислить корень каждого. Пусть это будет элементов, значение числа от 1 до 100. То есть на каждое число приходится "близнец". Функция square() будет вызвана 100 раз, а на остальные 100 элементов будет подставлено уже полученное ранее значение на такой же параметр.
Естественно, что нет никакого смысла применять этот аттрибут над функциями, которые могут выполняться быстрей чем поиск и выборка значения результата из таблицы в памяти. Более того, первичные вызовы функции могут быть намного медленней за счет добавления параметра и возвращаемого значения в таблицу в памяти (кеширования).
Использовать или не использовать зависит от того насколько медленно выполняется функция по сравнению с возможным оверхедом. Кроме того достаточно частые вызовы функции с огромным количеством разных значений может отъесть немало памяти к концу цикла. Можно представить сколько её понадобится, если в функцию будут последовательно передавать 4294967295 значений (размер int), правда в этом случае сам пользователь не дождется завершения программы, но если возвращаемое значение тоже int, то это уже как минимум 8Гб оперативы.