C ++: функция оптимизации без побочных эффектов

Есть ли в C ++ способ объявить, что функция не имеет побочных эффектов? Примите во внимание:

LOG("message").SetCategory(GetCategory()); 

Теперь предположим, что макрос LOG в сборках выпуска создает объект NullLogEntry, в котором SetCategory () определена как пустая функция. Таким образом, в основном все выражение можно (и нужно) оптимизировать - за исключением того, что теоретически вызов GetCategory () может иметь некоторые побочные эффекты, поэтому я думаю, компилятору не разрешено просто выбросить его.

Другим примером может быть специализация шаблона функции, которая игнорирует некоторые (или все) ее аргументы, но компилятору не разрешается сохранять оценку таких аргументов в месте вызова из-за возможных побочных эффектов.

Я прав? Или компиляторы все равно могут оптимизировать такие вызовы? Если нет, есть ли способ намекнуть компилятору, что эта функция не имеет побочных эффектов, поэтому, если возвращаемое значение игнорируется, весь вызов можно пропустить?

14
задан imre 8 July 2011 в 11:40
поделиться