Самое важное, что следует здесь отметить, это то, что макрос - это подстановка чистого текста , выполняемая препроцессором Компилятор (после этапа предварительной обработки) не знает и не заботится о том, что такое макрос.
Пример:
//this:
#define PRINT(s) std::cout << s;
int main(int, char**)
{
PRINT("hello world")
return 0;
}
//Will have identical codegen(in the same compiler version of course) to this:
int main(int, char**)
{
std::cout << "hello world";
return 0;
}
Однако для встроенных функций компилятор знает, когда вызывается функция, и имеет гораздо больше контекстной информации об ее использовании. Это также означает, как уже упоминали другие люди, что это запрос. Если компилятор посчитает, что вставка функции более вредна , он оставит ее как обычный вызов функции. В отличие от макросов, компилятор не будет иметь информации о повторении кода при использовании макроса.
Таким образом, если ваш код может использовать встроенную функцию, используйте ее вместо макроса. Вы помогаете компилятору улучшить ваш код, предоставляя ему больше информации.