Прежде всего, обратите внимание, что стоимость, которую они упоминают, составляет размер , а не скорость. Например, предположим, что макрос расширяется до 16 байт кода. Предположим далее, что функция компилируется в 32 байта кода, а вызов функции занимает 6 байтов кода (конечно, ни один из них не гарантирован, но все они, вероятно, по крайней мере в общем стандарте для 32-битного кода) код).
В этом случае, если вы используете функцию, но вызываете ее только из одного места, вы получите 38 байтов кода. Если вместо этого вы используете макрос, вы получите только 16 байтов кода для экономии 22 байтов. Если вы используете макрос в двух местах, вы получите 32 байта кода против 44 байтов, если бы вы использовали функцию - все еще экономию, но меньшую. Немного забегая вперед, давайте предположим, что вы использовали его из 10 разных мест в своем коде. В этом случае макрос будет занимать 160 байт, а функция - только 92 байта.
На современном процессоре я также вижу довольно разумный аргумент, что функция может быть и быстрее. Большинство современных процессоров используют кеширование. Если вы используете функцию достаточно, чтобы она обычно находилась в кеше при вызове, это может быть быстрее, чем при использовании макроса, где каждый раз, когда вы используете код, вам (скорее) придется извлекать код из памяти снова. Причина довольно проста: современный процессор работает на много быстрее, чем память.
Даже в лучшем случае вы можете запланировать задержку не менее 50 нс для извлечения некоторых данных из памяти (а 75-100 нс довольно распространены). Так же, как в среднем, давайте предположим, что 75 нс. Типичный современный процессор выполняет около 1,8 команд за такт, а на (скажем) 2,5 ГГц время тактового цикла составляет 0,4 нс. Это означает, что за 75 нс он может (в среднем) выполнить что-то вроде 75 / 0,4 * 1,8 = 337,5 инструкции. Вызов, выполнение и возврат из функции, о которой мы говорим здесь, где-то порядка полдюжины инструкций - так что в тесном цикле, к тому времени, когда вы получите код для макроса из памяти, как только вы может выполнить функцию из кэша где-то около 56 раз.
Конечно, если вы выполняете только это в узком цикле, макрос также будет в кеше большую часть времени. Преимущество для функции имеет место, когда у вас есть вызовы к этой функции из достаточно разных мест в коде, что она обычно будет в кеше даже на итерации цикла first , которая обычно не будет чехол для макроса.