Описание и реализация класса или функции в одном .h файле или в раздельном .h и .cpp

Гуглил, читал, в том числе и тут, но так и не могу понять, в чем итоговая разница для скомпилированного exe-шника, если в проекте функция или класс реализуются в одном .h файле или разделяется на описание и реализацию на .h и .cpp ?

Я понял, только, что если запихнуть все реализацию в хедер файл, то в случае большого проекта и в случае, если в проекте будет много #include "my_class.h" компилятор(или точнее транслятор ?) запихнет код моего класса в каждую "функцию", где стоит include.

Но, я так и не могу понять, на сам двоичный код готового exe-шника - это как то влияет ? То, ну хорошо, я разделил описание функции или класса и его реализацию, ну компилятор скомпилировал - это отдельно, НО, как это далее все в exe-файле тогда учитывается ? То есть, как функция, которая ссылается на мою функцию в итоговом бинарнике будет на нее ссылается ?

Вот вопрос в том, в чем разница именно в итоговом файле ?


Ответы (1 шт):

Автор решения: Slava

Ответ на этот вопрос несколько сложнее, чем может показаться.

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

С другой стороны, если имплементация будет в файле .cpp (или подобных), то инлайн такой функции становится менее вероятным (хотя некоторые компиляторы позволяют это делать). То есть скорее всего будет одна копия функции.

В общем, это больше влияет на время компиляции проекта и некоторые оптимизации. На размер проекта значительного влияния оказывать не должно.

→ Ссылка