Современные компиляторы, встраиваемые в файлы Cpp и накладные расходы на идиомы PImpl - PullRequest
0 голосов
/ 09 июля 2020

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

Но затем я недавно прочитал, что функции не могут быть встроены, если они не определены в файле заголовка, потому что в противном случае компилятор не увидит его когда он начинает работать с другим заголовком и файлами cpp (читать из. Я провел еще несколько исследований и обнаружил, что некоторые люди говорили, что это старый способ работы, и что современные компиляторы выполняют «оптимизацию всей программы» или « Генерация кода во время компоновки », которая отвечает за создание файлов obj, которые я привык видеть, которые затем можно связать вместе и оптимизировать, например, позволяя компилятору видеть функции в файле obj, которые когда-то были« скрыты ». в файле cpp и затем встроите их в нужную оптимизацию. Звучит здорово, но мне интересно, какому источнику доверять, и мне было интересно, могу ли я получить дополнительное мнение по этому поводу.

Дальнейшие исследования привели меня к более глубокому пониманию идиомы Pimpl и почему она используется, наиболее очевидно, чтобы сэкономить время компиляции и повысить читаемость и стабильность, но, продолжая читать, я заметил, что в документации cppreference.com / cpp / pimpl указано, что разделение информации заголовка от деталей реализации может привести к накладным расходам времени выполнения поскольку для вызовов функций требуется по крайней мере один уровень косвенного обращения в дополнение к увеличенным пространственным затратам из-за использования дополнительных указателей. Итак, если бы мне пришлось создать приложение реального времени, в котором производительность во время выполнения имеет высокий приоритет, лучше всего избегать идиомы Pimpl, и если да, я должен вместо этого использовать их предложенную альтернативу и пометить все функции встроенными и поместить их в файл заголовка (если я ' m правильно понимает предложенную альтернативу), или является альтернативой этому, например, использование только файлов cpp без возникновения ошибок lnk2005, которых я не вижу (возможно, с использованием только одного большого файла cpp).

Заранее благодарим за помощь, я знаю, что до этого момента потребовалось немного ползать текст.

...