Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 35, средняя оценка - 4.69
FanOfGun
6 / 6 / 1
Регистрация: 13.10.2012
Сообщений: 101
#1

реализация класса в .h файле хорошо или плохо? - C++

17.08.2013, 21:48. Просмотров 4854. Ответов 61
Метки нет (Все метки)

все знакомые мне ide разделяют класс на два файла: .h с описанием и .cpp с кодом, но, например, в boost .hpp файлы почти всегда содержат и реализацию классов, т.е. так тоже можно. так в чем тогда разница и когда какой способ нужно применять? заранее благодарен
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.08.2013, 21:48     реализация класса в .h файле хорошо или плохо?
Посмотрите здесь:
Такой способ создание экземпляра класса хорошо или плохо? C++
C++ Глобальные указатели. Плохо или хорошо?
C++ Переменные на русском языке - хорошо или плохо?
Статические функции-члены - хорошо или плохо? C++
C++ Реализация класса в отдельном файле
C++ Реализация шаблонов класса в инлайн файле
Реализация шаблонов класса в инлайн файле C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт CАвтор FAQ
17470 / 5708 / 363
Регистрация: 30.03.2009
Сообщений: 15,670
Записей в блоге: 26
20.08.2013, 15:12     реализация класса в .h файле хорошо или плохо? #61
Цитата Сообщение от Убежденный Посмотреть сообщение
1) Реализация методов в хидере.

Время: 1 минута 3 секунды.

...

3) Реализация методов в отдельном файле + опция LTCG.

Время: 25 секунд.
Такие результаты всё-таки говорят о том, что в режиме LTCG они всё-таки имеют какие-то дополнительные настройки компилятора. В таком тесте (когда он сформирован в виде одного исходника) никакие межмодульные оптимизации не в состоянии ускорить в 2 раза. Более, чем уверен, что в режиме без LTCG для первого теста можно добавить пару опций (понять бы только, каких), которые дадут то же самое ускорение.

Цитата Сообщение от Убежденный Посмотреть сообщение
Кстати, в точности такой же результат получается, если использовать LTCG для реализации методов в хидере. Подтверждая, что компилятору без разницы, где находится определение - в заголовке или в файле реализации.
Как я уже говорил, режим LTCG попросту превращает несколько исходников в один. Что принципиально не отличается от реализации методов в хидере с точки зрения инлайна (главное, что компилятор их начинает видеть). Но, как я уже говорил, лично я считаю более правильным писать исходники так, как это представляли себе разработчики Си++, закладываясь не естественную (классическую) сборку, а не надеясь на то, что компилятор на твоей системе умеет работать в режиме с межмодульным инлайном

gcc на втором примере в режиме -flto показал в точечности такое же время, как в первом режиме без -flto. Т.е. у gcc опция работает более честно, чем у интеловского компилятора. Т.е. опция только задаёт режим работы, не включая никаких дополнительных оптимизаций

Добавлено через 7 минут
Цитата Сообщение от Evg Посмотреть сообщение
Отсутствие замедление компиляции на интеловском компиляторе навело на мысль, что они сохраняют одну из последних стадий представления (т.е. сильно оптимизированное представление, близкое к низкому уровню). На таком представлении уже технически более сложно проводить инлайн и последующие за этим оптимизации (а именно ради последующих оптимизаций и делается инлайн, который сам по себе большого смысла не несёт)
Результаты на -flto на втором примере говорят о том, что такое предположение неверно. Скорее всего, работает некая гибридная схема. Формируем полный код а рядом кладём промежуточное представление (во всяком случае в бинарнике есть и то, и другое). Далее на финальной стадии анализируем промежуточное представление. Если ничего интересного в плане инлайна не нашли, то оставляем код, если нашли, то выполняем инлайн и перекомпиляцию. Такой подход выглядит вполне разумно, если оно именно так и реализовано, то беру назад свои слова про то, что этот режим плохой.

Но в любом случае, рекомендация по написанию методов в хидере остаётся в силе
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.08.2013, 21:35     реализация класса в .h файле хорошо или плохо?
Еще ссылки по теме:
Можно ли Хорошо посмотреть информацию о графическом файле в разных библиотеках? C++
Реализация класса на базе класса Stack с возможностью !индексирования! C++
C++ Перегрузка оператора индексации для класса плохо себя ведёт
Утилизация класса (размещение класса в другом файле) C++
C++ Посоветуйте книгу где хорошо описано внешнее сортировки, или хеширования

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Evg
Эксперт CАвтор FAQ
17470 / 5708 / 363
Регистрация: 30.03.2009
Сообщений: 15,670
Записей в блоге: 26
27.08.2013, 21:35     реализация класса в .h файле хорошо или плохо? #62
В тот раз хотел сказать, но потом вылетело из головы

Цитата Сообщение от Убежденный Посмотреть сообщение
Подтверждая, что компилятору без разницы, где находится
определение - в заголовке или в файле реализации
Но только в условиях, когда компилятору предоставлена возможность работы в режимах типа LTCG.

Если из файла t2.cc мы сформируем динамическую библиотеку (а это один из наиболее распространённых вариантов распространения кода), то в gcc режим -flto пролетает, т.к. в динамической линковке он уже не может участвовать. Думается, на интеловском компиляторе то же самое
Yandex
Объявления
27.08.2013, 21:35     реализация класса в .h файле хорошо или плохо?
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru