Да, есть разница. https://isocpp.org/wiki/faq/inline-functions .
Когда вы указываете, что функция является встроенной, вы вынуждаете компилятор поставить код метода в котором он когда-либо называется.
void myfunc() {
square(2);
}
идентичен
void myfunc() {
2 * 2;
}
Вызов функции хорош для четкости кода, но когда эта функция называется локальным состоянием, для перехода в стек, для этого метода устанавливается новое локальное состояние, и когда это делается, необходимо вывести предыдущее состояние. Это много накладных расходов.
Теперь, если вы повышаете уровень оптимизации, компилятор будет принимать решения, такие как разворачивание циклов или встроенные функции. Компилятор по-прежнему может игнорировать встроенный оператор.