В книге Чистый код (и еще несколько других, с которыми я столкнулся и прочитал) предлагается сохранить функции маленькими и разбить их, если они станут большой. Это также предполагает, что функции должны делать только одно и только одно.
В Оптимизация программного обеспечения на С++ Agner Fog заявляет, что ему не нравится правило разбивать функцию только потому, что она пересекает определенный порог ряда строк. Он утверждает, что это приводит к ненужным переходам, которые ухудшают производительность.
Во-первых, я понимаю, что не будет иметь значения, не работает ли код, над которым я работаю, в сложном цикле и что функции тяжелы, так что время, которое требуется для их вызова, затмевается ко времени, когда код в функция выполняет. Но предположим, что я работаю с функциями, которые в большинстве случаев используются другими объектами/функциями и выполняют относительно тривиальные задачи. Эти функции следуют рекомендациям, перечисленным в первом абзаце (т.е. Выполняют одну единственную функцию и малы/понятны). Затем я начинаю программировать критическую для производительности функцию, которая использует эти другие функции в узком цикле и по существу является функцией кадра. Наконец, предположим, что встраивание их имеет преимущество для функции производительности, но не имеет никакой пользы для любой другой функции (да, я профилировал это, хотя и с большим количеством копирования и вставки, которое я хочу избежать).
Сразу же можно сказать, что тег функции inline
и пусть компилятор выбирает. Но что, если я не хочу, чтобы все эти функции находились в файле .inl или отображались в заголовке? В моей текущей ситуации критически важные функции и другие функции, которые он использует, находятся в одном исходном файле.
Подводя итог, могу ли я выборочно (принудительно) встраивать функцию (функции) для одной функции, так что конечный код ведет себя как одна большая функция вместо нескольких вызовов другим функциям.