Почему и когда использовать __noop? - программирование
Подтвердить что ты не робот

Почему и когда использовать __noop?

Я читал о __ noop, а пример MSDN -

#if DEBUG
   #define PRINT   printf_s
#else
   #define PRINT   __noop
#endif

int main() {
   PRINT("\nhello\n");
}

и я не вижу выигрыша, просто имея пустой макрос:

#define PRINT

Сгенерированный код тот же. Каков допустимый пример использования __noop, который действительно делает его полезным?

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

#define PRINT
extern int some_complicated_calculation();
PRINT("%d\n", some_complicated_calculation());

будет вызывать функцию, даже если вам не нужен результат.

Используя __noop, функция не будет вызываться.

Вы могли (предполагая, что компилятор поддерживает переменные макросы) определяют PRINT, чтобы игнорировать аргументы; но тогда они вообще не будут разбираться и могут стать недействительными, если вы измените код вокруг них, не компилируя вариант, который определяет PRINT, чтобы что-то сделать. Используя __noop, аргументы все еще разбираются, поэтому с большей вероятностью остаются в силе.