powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / C++ [игнор отключен] [закрыт для гостей] / Прекомпилированные заголовочники
25 сообщений из 58, страница 1 из 3
Прекомпилированные заголовочники
    #39978583
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Неожиданный вопрос. :)

Я знаю, что это. У меня такой вопрос: всё же их стоит использовать или нет? Как-то сложилось в моей компании, считается что не стоит их использовать. Я даже забыл об их существовании. И всё же: это бест практикс или это плохо?

Пока разработка идёт в Студии, но возможно когда-то будет переход на gcc.
...
Рейтинг: 0 / 0
Прекомпилированные заголовочники
    #39978606
авторIMHO the popularity of header-only libs is caused by the popularity of template meta programming. For most compilers, templated libs must be header-only because the compiler can only start.
the main compile process when the type parameters are provided, and for full compilation and optimization the compiler must see "both at once" - the library code plus the template parameter.
values. That makes it impossible (or at least hard) to produce any "precompiled" compilation units for such a library.
https://softwareengineering.stackexchange.com/questions/305618/are-header-only-libraries-more-efficient


автор Libraries
Separating the class definition and class implementation is very common for libraries that you can use to extend your program. Throughout your programs, you’ve "#included" headers that belong.
to the standard library, such as iostream, string, vector, array, and other. Notice that you haven’t needed to add iostream.cpp, string.cpp, vector.cpp, or array.cpp into your projects.
Your program needs the declarations from the header files in order for the compiler to validate you’re writing programs that are syntactically correct.
However, the implementations for the classes that belong to the C++ standard library is contained in a precompiled file that is linked in at the link stage. You never see the code.

Outside of some open source software (where both .h and .cpp files are provided), most 3rd party libraries provide only header files, along with a precompiled library file.
There are several reasons for this:
1) It’s faster to link a precompiled library than to recompile it every time you need it,
2) a single copy of a precompiled library can be shared by many applications, whereas compiled code gets compiled into every executable that uses it (inflating file sizes),
3) intellectual property reasons (you don’t want people stealing your code).
...
Рейтинг: 0 / 0
Прекомпилированные заголовочники
    #39978713
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Роза,

Это тут при чём? :)
...
Рейтинг: 0 / 0
Прекомпилированные заголовочники
    #39978717
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
всё же их стоит использовать или нет?
пока полная пересборка проекта не переваливает за пяток минут, можно не париться и прекомпилированные заголовки не использовать )
...
Рейтинг: 0 / 0
Прекомпилированные заголовочники
    #39978735
petrav
Это тут при чём? :)

там 2 ответа (из разных источников) на ваш вопрос:
petrav
У меня такой вопрос: всё же их стоит использовать или нет?
...
Рейтинг: 0 / 0
Прекомпилированные заголовочники
    #39978739
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Роза
petrav
Это тут при чём? :)

там 2 ответа (из разных источников) на ваш вопрос:
petrav
У меня такой вопрос: всё же их стоит использовать или нет?

У меня, конечно, не очень с английским, но мне кажется, что в приведённой вами цитате речь идёт о заранее откомпилированных файлах реализации в подключаемых библиотеках. Разве нет? Не могли бы подробнее пояснить?
...
Рейтинг: 0 / 0
Прекомпилированные заголовочники
    #39978742
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя в первой цитате, да, написано, что прекомпилировать шаблоны бесполезно. Но вот авторы PVS Studio с этим не согласны.
...
Рейтинг: 0 / 0
Прекомпилированные заголовочники
    #39978889
ну отнесите текст сюда и будет счастье.
в первой цитате речь про шаблоны, для которых прекомпилированные заголовки становятся проблемой.
во второй:
авторБиблиотеки
Разделение определения класса и реализации класса очень распространено для библиотек, которые вы можете использовать для расширения вашей программы. Во всех ваших программах у вас есть "#included" заголовки, которые принадлежат стандартной библиотеке, такие как iostream, string, vector, array и другие. Обратите внимание, что вам не нужно добавлять iostream.cpp, string.cpp, vector.cpp или array.cpp в ваши проекты.
Ваша программа нуждается в объявлениях из заголовочных файлов, чтобы компилятор мог проверить, что вы пишете программы, которые синтаксически верны.
Однако реализации для классов, которые принадлежат стандартной библиотеке C++, содержатся в предварительно скомпилированном файле, который связан на этапе компоновки. Вы никогда не увидите код.

За исключением некоторых программ с открытым исходным кодом (где предоставляются файлы .h и .cpp), большинство сторонних библиотек предоставляют только заголовочные файлы вместе с предварительно скомпилированным библиотечным файлом.
На это есть несколько причин:
1) Быстрее связать предварительно скомпилированную библиотеку, чем перекомпилировать ее каждый раз, когда вам это нужно,
2) одна копия предварительно скомпилированной библиотеки может использоваться многими приложениями, в то время как скомпилированный код компилируется в каждый исполняемый файл, который его использует (раздувая размеры файлов),
3) причины интеллектуальной собственности (вы не хотите, чтобы люди крали ваш код).
здесь написано, чем удобно разделение на .h и .c

Можете ещё тут почитать.

зы: STL и Boost держат все свои сырцы в .h
...
Рейтинг: 0 / 0
Прекомпилированные заголовочники
    #39978907
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych
petrav
всё же их стоит использовать или нет?
пока полная пересборка проекта не переваливает за пяток минут, можно не париться и прекомпилированные заголовки не использовать )
+1
ТС, у вас более 5 минут?
...
Рейтинг: 0 / 0
Прекомпилированные заголовочники
    #39978910
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
это бест практикс или это плохо?
я так понимаю, это зависит сильно от того, как развесисто используются зависимости.
Если не ошибаюсь, то когда не используются - при компиляции будут пересобраны все зависимые хедеры, иначе будут использоваться прекомпиленные хедеры, и это сократит время сборки. Но если зависимостей мало, то в большом количестве случаев - всё равно, время на компиляцию зависимых заголовков будет небольшим.
Меньше #incude в заголовках - это бест практикс.
А вот в случае использования, опять могу ошибаться, могут возникать проблемы, которые лечатся только полной перекомпиляцией проекта (таблетки "Ребилдол").
...
Рейтинг: 0 / 0
Прекомпилированные заголовочники
    #39978916
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А потом можно почитать требования к такой прекомпиляции. Например "такой заголовок может
быть только один" или "там не могут использоваться макросы".
И понять, что дело тухлое.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Прекомпилированные заголовочники
    #39978931
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
egorych
пропущено...
пока полная пересборка проекта не переваливает за пяток минут, можно не париться и прекомпилированные заголовки не использовать )
+1
ТС, у вас более 5 минут?

Ну как-то около 5-ти.

Вот, кстати, статью интересную про прекомпилированные заголовочники нашёл.
...
Рейтинг: 0 / 0
Прекомпилированные заголовочники
    #39979032
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav,
Хммм. Разбейте по модулям работающим в разных процессах.
А билд всего и вся делайте ночью.
Так делают не только в плюсах.
...
Рейтинг: 0 / 0
Прекомпилированные заголовочники
    #39979047
CEMb
Меньше #incude в заголовках - это бест практикс.

а сколько людей тут не знает о том, что template компилируется, только если используется?

на самом деле, я не вижу ничего плохого в том, чтобы отдельно компилить /core/, /app/, /какой_то_микросервис/
но вот каждый файл - это сущий гемор. Шаблоны практичней.
...
Рейтинг: 0 / 0
Прекомпилированные заголовочники
    #39979055
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Роза
CEMb
Меньше #incude в заголовках - это бест практикс.

а сколько людей тут не знает о том, что template компилируется, только если используется?

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

- Препроцессинг.
- Разбор на лексемы.
- Проверка синтаксиса.

Да наверняка много ещё чего.
...
Рейтинг: 0 / 0
Прекомпилированные заголовочники
    #39979084
там во всей статье слово "шаблон" встречается 0 раз
Статья то вообще про stdafx.h и весь тот гемор, который прилетает счастливым его пользователям.
Я несчастный пользователь линуха, поэтому от VS далёк полностью.
Ничего нового в статье не узнал. Кроме того, что от stdafx.h лучше быть дальше, чем ближе.
В том пдф выше всё компактней, понятней и по теме.
...
Рейтинг: 0 / 0
Прекомпилированные заголовочники
    #39979255
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Роза
там во всей статье слово "шаблон" встречается 0 раз
Статья то вообще про stdafx.h и весь тот гемор, который прилетает счастливым его пользователям.

Значит плохо читали. :)
...
Рейтинг: 0 / 0
Прекомпилированные заголовочники
    #39979672
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Роза

зы: STL и Boost держат все свои сырцы в .h

Это неверно.
...
Рейтинг: 0 / 0
Прекомпилированные заголовочники
    #39979675
на линухе верно
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
:/usr/include/c++/8/bits$ ls
algorithmfwd.h             deque.tcc                 indirect_array.h         ostream.tcc          regex_scanner.h      stl_iterator_base_funcs.h  streambuf.tcc
allocated_ptr.h            enable_special_members.h  invoke.h                 parse_numbers.h      regex_scanner.tcc    stl_iterator_base_types.h  stream_iterator.h
allocator.h                exception_defines.h       ios_base.h               postypes.h           regex.tcc            stl_iterator.h             stringfwd.h
alloc_traits.h             exception.h               istream.tcc              predefined_ops.h     shared_ptr_atomic.h  stl_list.h                 string_view.tcc
atomic_base.h              exception_ptr.h           list.tcc                 ptr_traits.h         shared_ptr_base.h    stl_map.h                  uniform_int_dist.h
atomic_futex.h             forward_list.h            locale_classes.h         quoted_string.h      shared_ptr.h         stl_multimap.h             unique_ptr.h
atomic_lockfree_defines.h  forward_list.tcc          locale_classes.tcc       random.h             slice_array.h        stl_multiset.h             unordered_map.h
basic_ios.h                fs_dir.h                  locale_conv.h            random.tcc           specfun.h            stl_numeric.h              unordered_set.h
basic_ios.tcc              fs_fwd.h                  locale_facets.h          range_access.h       sstream.tcc          stl_pair.h                 uses_allocator.h
basic_string.h             fs_ops.h                  locale_facets_nonio.h    refwrap.h            std_abs.h            stl_queue.h                valarray_after.h
basic_string.tcc           fs_path.h                 locale_facets_nonio.tcc  regex_automaton.h    std_function.h       stl_raw_storage_iter.h     valarray_array.h
boost_concept_check.h      fstream.tcc               locale_facets.tcc        regex_automaton.tcc  std_mutex.h          stl_relops.h               valarray_array.tcc
c++0x_warning.h            functexcept.h             localefwd.h              regex_compiler.h     stl_algobase.h       stl_set.h                  valarray_before.h
char_traits.h              functional_hash.h         mask_array.h             regex_compiler.tcc   stl_algo.h           stl_stack.h                vector.tcc
codecvt.h                  gslice_array.h            memoryfwd.h              regex_constants.h    stl_bvector.h        stl_tempbuf.h
concept_check.h            gslice.h                  move.h                   regex_error.h        stl_construct.h      stl_tree.h
cpp_type_traits.h          hash_bytes.h              nested_exception.h       regex_executor.h     stl_deque.h          stl_uninitialized.h
cxxabi_forced.h            hashtable.h               node_handle.h            regex_executor.tcc   stl_function.h       stl_vector.h
cxxabi_init_exception.h    hashtable_policy.h        ostream_insert.h         regex.h              stl_heap.h           streambuf_iterator.h



Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
:/usr/include/boost/asio$ ls
associated_allocator.hpp     basic_waitable_timer.hpp       detail                         io_service.hpp                 serial_port.hpp              time_traits.hpp
associated_executor.hpp      bind_executor.hpp              dispatch.hpp                   io_service_strand.hpp          serial_port_service.hpp      ts
async_result.hpp             buffered_read_stream_fwd.hpp   error.hpp                      ip                             signal_set.hpp               unyield.hpp
basic_datagram_socket.hpp    buffered_read_stream.hpp       execution_context.hpp          is_executor.hpp                signal_set_service.hpp       use_future.hpp
basic_deadline_timer.hpp     buffered_stream_fwd.hpp        executor.hpp                   is_read_buffered.hpp           socket_acceptor_service.hpp  uses_executor.hpp
basic_io_object.hpp          buffered_stream.hpp            executor_work_guard.hpp        is_write_buffered.hpp          socket_base.hpp              version.hpp
basic_raw_socket.hpp         buffered_write_stream_fwd.hpp  experimental                   local                          spawn.hpp                    waitable_timer_service.hpp
basic_seq_packet_socket.hpp  buffered_write_stream.hpp      experimental.hpp               packaged_task.hpp              ssl                          wait_traits.hpp
basic_serial_port.hpp        buffer.hpp                     generic                        placeholders.hpp               ssl.hpp                      windows
basic_signal_set.hpp         buffers_iterator.hpp           handler_alloc_hook.hpp         posix                          steady_timer.hpp             write_at.hpp
basic_socket_acceptor.hpp    completion_condition.hpp       handler_continuation_hook.hpp  post.hpp                       strand.hpp                   write.hpp
basic_socket.hpp             connect.hpp                    handler_invoke_hook.hpp        raw_socket_service.hpp         streambuf.hpp                yield.hpp
basic_socket_iostream.hpp    coroutine.hpp                  handler_type.hpp               read_at.hpp                    stream_socket_service.hpp
basic_socket_streambuf.hpp   datagram_socket_service.hpp    high_resolution_timer.hpp      read.hpp                       system_context.hpp
basic_streambuf_fwd.hpp      deadline_timer.hpp             impl                           read_until.hpp                 system_executor.hpp
basic_streambuf.hpp          deadline_timer_service.hpp     io_context.hpp                 seq_packet_socket_service.hpp  system_timer.hpp
basic_stream_socket.hpp      defer.hpp
...
Рейтинг: 0 / 0
Прекомпилированные заголовочники
    #39979679
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Роза
на линухе верно

На Линуксе вы можете использовать boost::filesystem или boost::mutex без линковки библиотек?
Модератор: Редактировано
...
Рейтинг: 0 / 0
Прекомпилированные заголовочники
    #39979691
вы что там под градусом чтоли
Алексей Роза
зы: STL и Boost держат все свои сырцы в .h

эта "таблица" и есть сырцы.
а линковка вообще причём?
речь была про то, что STL не юзает прекомпиляцию, а повсеместно юзает шаблоны в голых хедерах.
...
Рейтинг: 0 / 0
Прекомпилированные заголовочники
    #39979693
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Роза
вы что там под градусом чтоли
Алексей Роза
зы: STL и Boost держат все свои сырцы в .h

эта "таблица" и есть сырцы.

Эта таблица не исходники, а список файлов.

Алексей Роза
а линковка вообще причём?
речь была про то, что STL не юзает прекомпиляцию, а повсеместно юзает шаблоны в голых хедерах.

Не съезжайте. Речь была про это:
Алексей Роза
зы: STL и Boost держат все свои сырцы в .h

Это неверно. Иначе на сайте boost не лежала бы инструкция по сборке Boost в том числе и для Unix-like систем. С библиотекой STL тоже самое.
...
Рейтинг: 0 / 0
Прекомпилированные заголовочники
    #39979694
мда
давайте вы это утром прочитаете ещё раз, чтобы вам стыдно стало.
...
Рейтинг: 0 / 0
Прекомпилированные заголовочники
    #39979697
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Роза,

Предлагаю начать обсуждение с такого файла:

Код: plaintext
boost\asio\impl\src.cpp

И ответить заодно на вопрос. Если всё обстоит вот так:
Алексей Роза
зы: STL и Boost держат все свои сырцы в .h

То почему целый ряд под-библиотек Boost-а требует сборки? И на выходе lib и dll ?
...
Рейтинг: 0 / 0
Прекомпилированные заголовочники
    #39979826
чё-то не отпустило вас до сих пор
petrav
Эта таблица не исходники, а список файлов.

.h-файлов! чистых хедеров с шаблонами, которые просто втыкаются в main.cpp и вы получаете 1 .o-файл.
А вот так выглядят файлы с сабжем:
Код: plaintext
1.
2.
config.h     date.h            fcgi_handler.h   fcgi_server.h     gearman.h         json.cpp  main.cpp  Makefile     regex.h        sitemap_handler.cpp  url.h       wp_handler.cpp  xml.h
config.h.in  fcgi_handler.cpp  fcgi_server.cpp  gearman_client.h  gearman_worker.h  json.h    main.h    Makefile.in  scoped_lock.h  sitemap_handler.h    worker.cpp  wp_handler.h


где .cpp - компилируется в .o
а .h вставляется в ваш код и содержит только: описание функций, макросы, константы, виртуалки и т.п.

Да, вы можете взять те .h-файлы из STL, создать под каждый .cpp и ПРЕкомпилировать себе кучу .o, которые потом будете юзать повторно БЕЗ доп.компиляция.
Только нахуа?!
Я же написал русским по белому специально для вас:
Алексей Роза
а сколько людей тут не знает о том, что template компилируется, только если используется?

Когда вы компилируете .h, где сплошные шаблоны, вы НЕ компилируете весь этот код к себе.
Это код НЕ существует, пока вы ему параметр не дадите.
Компилятор НЕ создаёт эти функции, пока вы их не вызовите с параметром.
Без параметра их НЕТ.

И вот это решает проблему с грудой лишнего кода, теперь можно делать, как я сказал:
Алексей Роза
на самом деле, я не вижу ничего плохого в том, чтобы отдельно компилить /core/, /app/, /какой_то_микросервис/
но вот каждый файл - это сущий гемор. Шаблоны практичней.

Тогда к этому никогда и не придём:
egorych
пока полная пересборка проекта не переваливает за пяток минут , можно не париться и прекомпилированные заголовки не использовать )

Мне вот лично совершенно не понравилось отдельно описывать все эти ф-и. Т.е. по факту в разных файлах держать одно и то же. В одном изменил параметры, а в другом забыл = ошибка.
petrav
Вы можете что-то разумное сказать?

А вы что-то разумное понять можете? Что за хамство началось. Вы тут точно за помощью?
petrav
То почему целый ряд под-библиотек Boost-а требует сборки? И на выходе lib и dll ?

какое отношение это вообще имеет к сабжу??
...
Рейтинг: 0 / 0
25 сообщений из 58, страница 1 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Прекомпилированные заголовочники
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]