Компилятор GCC С++ предлагает семейство расширений через атрибуты функций, например:
int square(int) __attribute__((const));
Два атрибута, в частности, const
и pure
, позволяют объявить, что оценка функции не имеет побочных эффектов и зависит только от ее аргументов (const
) или только от ее аргументов и глобальных переменных (pure
). Это позволяет исключить общее подвыражение, что может привести к тому, что такая функция вызывается меньше раз, чем она написана в коде.
Мой вопрос заключается в том, можно ли это безопасно, правильно и разумно использовать для виртуальных функций-членов:
struct Foo
{
virtual int square(int) __attribute__((pure)); // does that make sense?
};
Есть ли у этого разумная семантика? Разрешено ли вообще? Или это просто игнорируется? Боюсь, я не могу найти ответ на это в документации GCC.
Причина этого вопроса заключается в том, что существует семейство параметров компилятора -Wsuggest-attribute
, которые заставляют GCC создавать предложения о том, где эти атрибуты могут быть помещены для улучшения кода. Тем не менее, похоже, в конечном итоге эти предложения предлагаются даже для виртуальных функций, и мне интересно, следует ли серьезно относиться к этим предложениям.