Я думаю, что компиляторы используют какую-то эвристику, чтобы решить, стоит ли встроить функцию.
Если функция вызывается только из одного места, ее вставка может сбрить несколько инструкций и циклов, увеличив размер и скорость.
Если это крошечная функция, то вставка может сделать то же самое.
Если функция вызывается в узком цикле много раз, встраивание может улучшить производительность.
В то же время встраивание может привести к большему коду в целом, а также может иметь некоторые негативные последствия для производительности из-за кэширования большего количества кода.
Компиляторы пытаются сделать оптимальный выбор, но они также должны принимать во внимание такие вещи, как настраиваемые параметры оптимизации (программист может сказать, что он предпочитает скорость по размеру или наоборот) и сколько времени им понадобится принять эти решения и сгенерировать код (вы не хотите, чтобы компилятор сильно оптимизировал все и занимал много дополнительных часов или дней, чтобы скомпилировать ваш код). Есть компромиссы.
Кроме того, компиляторы не всемогущи. Они просто не могут сложить определенные двойки и двойки не потому, что это дорого, а потому, что это почти невозможно Вот почему мы проводим тестирование производительности и нагрузки, используем профилировщики и пишем код, потому что люди, как правило, умнее своих программ.