Увеличивает ли код в заголовочном файле размер двоичного файла?

Учти это:

class Foo{
      void func1(){
            /*func1 code*/

      }

      void func2(){
            /*func2 code*/

      }


};

Случай 1: класс Foo в Foo.h

Случай 2: класс Foo красиво разделен между Foo.h и Foo.cpp

Различные другие файлы cpp включают Foo.h

Мой вопрос... Приведет ли Случай 1 к большему бинарному файлу?


person Aman Aggarwal    schedule 16.10.2009    source источник


Ответы (5)


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

person AnT    schedule 16.10.2009

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

Также информация RTTI и виртуальные таблицы также используют тот же сценарий.

При использовании динамических библиотек слабое соединение символов может происходить во время выполнения, если они используют один и тот же класс.

person Xeor    schedule 16.10.2009

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

person Malkocoglu    schedule 16.10.2009
comment
Заголовок примера не иллюстрирует статические функции. - person Jonathan Leffler; 16.10.2009

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

person Mark Ransom    schedule 16.10.2009
comment
На самом деле я не получаю ошибок компоновщика. Просто обеспокоен размером кода. Спасибо за ответ - person Aman Aggarwal; 16.10.2009
comment
Конечно, если бы это был код C, тогда были бы ошибки компоновщика. - person Aman Aggarwal; 16.10.2009
comment
@hotadvice: никаких ошибок компоновщика с C; компилятор отклонил бы код как недопустимый перед вызовом компоновщика. - person Jonathan Leffler; 16.10.2009

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

person Jonathan Leffler    schedule 16.10.2009