C ++: встроенные функции и генерация временного кода ссылки - PullRequest
7 голосов
/ 02 апреля 2009

Некоторое время назад моя кодовая база была очень близка к #include аду. Каждый раз, когда я менял даже слегка важный файл .h, практически все файлы перекомпилировались.
Основная причина такой высокой зависимости заголовка заключалась в том, что у меня есть много небольших функций, которые должны быть встроенными, и у меня сложилось впечатление, что для работы inline они должны быть в той же единице перевода, что и вызывающий код, поэтому они должны быть в шапке. Чтобы встроенная функция даже компилировала другие заголовки, в заголовок также необходимо включить ad infimum.

Введите генерация кода времени ссылки (в Visual Studio). Одним из основных заявленных преимуществ этого является то, что теперь встроенная функция может пересекать единицы перевода.
Но я все еще сомневаюсь. Как я могу быть действительно уверен, что эти функции действительно встроены? Я понимаю, что компилятор может делать все, что захочет, независимо от того, где я определяю функцию.

Есть ли способ проверить, что встраивается?

Ответы [ 5 ]

7 голосов
/ 02 апреля 2009

Я знаю, что в C ++ это запрещено, но вы могли бы реализовать функции как макросы препроцессора. Извините, пока я иду вымыть рот с мылом.

3 голосов
/ 02 апреля 2009

Одним из относительно простых способов является использование профилировщика. Если функция встроена, вы не увидите ее в потоке контрольного графа.

3 голосов
/ 02 апреля 2009

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

3 голосов
/ 02 апреля 2009

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

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

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

1 голос
/ 02 апреля 2009

Получив исполняемый файл, вы можете использовать инструменты для его проверки и поиска имен встроенных функций в таблицах символов. Одним из таких очень полезных инструментов является Dependency Walker .

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

Я думаю, что для Visual Studio сборки "Release" часто совпадают, но я не совсем уверен.

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