|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
Мешает ли разделение кода на объявление (.h) и определение (.cpp) inline оптимизации?22.08.2017, 16:33. Показов 1428. Ответов 18
Метки нет (Все метки)
Читал что когда включают хедер но не реализацию в единицу трансляции, это мешает компилятору инлайнить функции/методы ввиду того что нужного кода в этой единице трансляции нет, инлайнить нечего, и поэтому компилятор вынужден генерировать код который представляет собой именно вызов функции.
Выходит если важна производительность, то такие хедера лучше не использовать? Насколько я понимаю использование .h файлов дают возможность ознакомиться с интерфейсом реализации в простой форме(не вникая в саму реализацию когда мы читаем код), а так же ускоряет компиляцию за счёт того что в единице трансляции отсутствует код реализации, за счёт этого конечный бинарник по идее должен быть меньше чем если бы мы включали реализацию в каждую единицу трансляции. Верны ли эти утверждения?
0
|
|
| 22.08.2017, 16:33 | |
|
Ответы с готовыми решениями:
18
Объявление и определение глобального массива структур. Доступ к нему из любого cpp. Как? Как выглядит объявление переменной на уровне машинных команд — с точки зрения оптимизации кода? |
|
|
|
| 22.08.2017, 21:04 | |
|
Ты просто смотришь на вопрос в немного вывернутой форме. При проектировании программы функции нужно распихивать по различным модулям (единицам компиляции) таким образом, чтобы горячие вызовы по возможности находились внутри одного модуля. Грамотное использование *.h упрощает этот процесс
1
|
|
|
Неэпический
|
|||
| 22.08.2017, 21:12 | |||
|
к одной реализации, остальные будут выпилены.
1
|
|||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 22.08.2017, 22:59 [ТС] | |
|
Evg,
Всмысле в один модуль? По смыслу это может быть некорректно... Может быть как модуль работающий с базой данных, а другой работает с сетью, ты предлагаешь все это оформить как один модуль? Но я так и не понял как решить проблему которая связывает руки компилятору и не позволяет ему инлайнить(если конечно это утверждение верно, и такая проблема есть. Во всяком случае читал что есть...). Первое что приходит в голову это не использовать .h
0
|
|
|
Ушел с форума
|
|||
| 23.08.2017, 11:53 | |||
|
Не могу не вспомнить нашу старую дискуссию с Evg по этому поводу: реализация класса в .h файле хорошо или плохо? уже последним делом заниматься "выжиманием тактов" и т.п.
1
|
|||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||
| 23.08.2017, 12:10 | ||
|
Отдельный пункт - разделение кода на h и cpp может порождать так называемый недостижимый код. Это когда сначала компилятор скомпилировал функцию потому что "ну она же есть в cpp, может из других cpp вызывается". А потом оказалось что нигде эта функция не вызывается, так мертвым грузом и висит. На производительность это не влияет, но вес exe увеличивает. Что, правда, не особо заметно на фоне безобразия "прилинкую мегабайт stl-библиотек, потому что мне лень распиливать один шмат заранее скомпилированного кода на десяток шматиков поменьше" (че? Безобразие? Купи терабайтный винт и гигабитный инет, нищеброд!).
1
|
||
|
|
||||
| 23.08.2017, 12:13 | ||||
|
Я тут всё-таки предполагаю, что ты действительно понимаешь, что такое *.h (т.е. как работает директива #include) Не по теме:
2
|
||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 23.08.2017, 12:32 [ТС] | |
|
Убежденный,
Спасибо за совет! Ну алгоритмы и архитектура это само собой, просто хотел уточнить для себя этот момент, что бы лучше разбираться в том как это работает Renji, Evg, В целом понятно, спасибо! Ещё читал что можно перед объявлением функции в .h файле явно написать ключевое слово inline и что это поможет компилятору заинлайнить эту функцию. Но каким образом, если единица трансляции уже скомпилирована а реализация находится за её пределами? Вот это немного путает. Где то говорят что если реализация находится в другой единице трансляции то про инлайн можно забыть, а где то говорят что в таком случае достаточно явно указать инлайн при объявлении функции. И не знаешь кому верить. Наверное надо учиться понимать ассемблерные листинги, компилить, проверять на каждом компиляторе....
0
|
|
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|||||||
| 23.08.2017, 12:41 | |||||||
0
|
|||||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 23.08.2017, 12:55 [ТС] | |
|
Renji,
Ну когда реализация находится в том же файле это вопросов не вызывает...
0
|
|
|
|
||
| 23.08.2017, 14:48 | ||
|
Правда вопрос я толком всё равно не понял
1
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||
| 23.08.2017, 15:58 | ||||
|
Добавлено через 8 минут что есть в спп файлах. другое дело, если вы уже собрали статическую либу, то оптимизировать её код при линковке с целевым приложением он уже не будет. нужно использовать эффективные алгоритмы, а не пытаться экономить на спичках. инйлан компилятора - его епархия. он сам знает что и когда нужно инлайнить. вас это не касается.
1
|
||||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||
| 23.08.2017, 16:34 | ||
|
0
|
||
|
|
||
| 23.08.2017, 16:44 | ||
|
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
| 23.08.2017, 16:50 | |
|
0
|
|
|
|
||
| 24.08.2017, 16:47 | ||
|
1
|
||
| 24.08.2017, 16:47 | |
|
Помогаю со студенческими работами здесь
19
Inline методы класса в cpp-файле Разделение на .cpp и .h Разделение на h и cpp Разделение шаблона на h и cpp и макросы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|
Фото: Daniel Greenwood
kumehtar 13.11.2025
|
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга,
Ты же видел моря и метели.
Как сменялись короны и стяги,
Как эпохи стрелою летели.
- Этот мир — это крылья и горы,
Снег и пламя, любовь и тревоги,
И бескрайние. . .
|