Реализация функции в: file.h против в file.cxx - PullRequest
0 голосов
/ 24 октября 2009

Мой вопрос очень прост:

Я работаю над старым унаследованным кодом, где большая часть функций реализована только в заголовочном файле. Насколько мне известно, функция преобразования компилятора, реализованная в заголовке, в встроенные функции.

Я хотел знать, перенесу ли я эту реализацию в файл .cxx, какие будут преимущества?

Ответы [ 4 ]

3 голосов
/ 24 октября 2009

Для компилятора нет разницы между входными данными, которые поступают из файла .cxx или файла .h, этот текст компилируется в одну и ту же единицу перевода.

Основная причина, по которой мы обычно , а не помещаем код в файлы заголовков, состоит в том, чтобы избежать дублирования объектов, которые затем конфликтуют на уровне компоновщика, когда данный заголовок используется несколькими .cxx файлы.

Возможно, вы путаете встроенные функции с макросами, поскольку в случае макросов, которые по сути являются директивой предварительной обработки, нет риска возникновения конфликтов компоновщика во времени, даже если / если одни и те же заголовки включены несколько раз для разные единицы перевода.

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

Теперь, чтобы ответить на вопрос, по сути, перемещение всего этого кода из заголовочных файлов в файлы cpp не должно сильно влиять ни на размер двоичного файла, ни на производительность.
По-видимому, если определения функций в заголовочных файлах не были указаны явно, для каждого созданного exe / dll должен быть только один пользователь заголовочного файла (в противном случае во время компоновки были бы дубликаты), и, следовательно, файл не изменился бы. в любом направлении.
Что касается производительности, то с общим приростом производительности в аппаратном обеспечении, даже если функции, которые ранее были встроены, теперь должны вызываться нормально, это должно происходить в целом незамеченным, с точки зрения производительности, за исключением, возможно, определенных узких циклов, где логика повторяется очень раз.

2 голосов
/ 24 октября 2009

Хорошая идея, мигрируйте, не используйте макро / встроенные бананы

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

Со временем работа отдельных машин перестала быть проблемой производительности.

На самом деле ситуация несколько изменилась. Расширение процедуры во встроенный код повсеместно принесло мало пользы в минимизации уже оптимизированных операций машинного вызова процедур, выполняемых процессором, но уничтожило кэш, тратя драгоценное пространство внутреннего кеш-кольца с миллионами копий одной и той же функции.

Я говорю: определите реальные функции. Процессор справится с этим просто отлично.

Ваше приложение является артефактом эпохи, когда распространение кода на прямолинейное исполнение было популярным. Я думаю, что часть этого относится к оригинальному VAX 11/780, который был первой популярной 32-битной системой Unix и в течение некоторого времени являлся определением ЦП 1 MIPS, но для раздутой и микрокодированной инструкции calls потребовалось 17 мкс. выполнить. Да, 17x , что у обычной операции. Это уже не так, но стиль кодирования BSD, который разумно пытался справиться со странностью VAX, все еще сохраняется и по сей день. (Привет, я фанат BSD, но сегодня нам не нужно все в макросах.)

Итак, чтобы ответить на ваш точный вопрос: вы получите лучшую производительность кеша, перенеся эти подпрограммы в индивидуально связанные модули .cxx, как вы предложили. Иди вперед и сделай это.

1 голос
/ 24 октября 2009

Назначение файла заголовка - содержать определения, которые могут быть включены в несколько исходных файлов. Код, помещенный в файл заголовка, включается в исходный файл, который затем компилируется. Что касается скомпилированного кода, он такой же, как если бы все содержимое этого заголовка было частью источника.

Размещение кода в заголовке или исходном файле (cxx) является условием. Компилятор не будет изменять поведение в зависимости от того, где он находится.

0 голосов
/ 03 августа 2013

вы можете найти ответ в главе 6 «Изоляция» «Крупномасштабного проектирования программного обеспечения C ++»

Содержащаяся деталь реализации, которая может быть изменена, добавлена ​​или удалена без принудительного перекомпиляции клиентов называется изолированным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...