Компилятор GCC C++ предлагает семейство расширений через атрибуты функций, такие как:
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 предлагать варианты размещения этих атрибутов для улучшения кода. Тем не менее, кажется, что в конечном итоге эти предложения делаются даже для виртуальных функций, и мне интересно, следует ли воспринимать эти предложения всерьез.