When I include boost library hpp header in two translation units, does the boost code compile twice (and the binary size is double, comparing to the traditional precompiled library?)?
How does (boost like) header only libraries influence compilation size?
1k Views Asked by user2449761 At
2
There are 2 best solutions below
0
ChrisWard1000
On
There are some boost header files which are particularly large(I'm looking at you boost/lexical_cast.hpp), which will cause the binary to be larger. However, compilers offer some options to help:
MSVC has an option /LTCG (Link-time Code Generation)
GCC has -flto(I believe is enabled with -O3)
These options generally permit the linker to discard unused components and reduce duplication across the compilation unit.
Related Questions in C++
- C++ using std::vector across boundaries
- Linked list without struct
- Connecting Signal QML to C++ (Qt5)
- how to get the reference of struct soap inherited in C++ Proxy/Service class
- Why we can't assign value to pointer
- Conversion of objects in c++
- shared_ptr: "is not a type" error
- C++ template using pointer and non pointer arguments in a QVector
- C++ SFML 2.2 vectors
- Lifetime of temporary objects
- I want to be able to use 4 different variables in a select statement in c ++
- segmentation fault: 11, extracting data in vector
- How to catch delay-import dll errors (missing dll or symbol) in MinGW(-w64)?
- How can I print all the values in this linked list inside a hash table?
- Configured TTL for A record(s) backing CNAME records
Related Questions in BOOST
- Non-intruisive Boost serialization of labelled enums C++
- error WinSock.h has already been included Boost Windows Qt
- How to get rid of the ".\r\n" characters appended to the error message from FormatMessageA?
- What is the equivalent of boost::system::error_code with GetLastError in C++ Standard Library?
- Copy constructor required to be explicity defined with mutex
- boost spirit: how to match any lexer token in qi?
- boost resume thread on mutex unlock
- boost mpi sends NULL messages
- BOOST & GCC, undefined reference to boost
- CSV like Parse ( whitespace delimiter and boost )
- How does Boost.Units come up with this imprecise result of conversion?
- No viable overloaded '=' in std::bind function
- How should boost::lockfree::spsc_queue's read_available and write_available be used?
- add line in cmake to edit Makefile definition
- How does boost::subgraph work? Can we use filtered graph?
Related Questions in COMPILATION
- gcc static library compilation
- AngularJS directive within ng-if won't run
- How do I compile QScintilla and Eric6 on Linux?
- Troubleshoot slow compilation
- C ignoring incrementation
- Compiling or using RtMidi on Windows 7
- within a project can I compile a module and interactively load the compiled module within ghci?
- C++ / compilation of a program fatal error: QtGui/qwidget.h: No such file or directory
- What do I have to consider when putting all code in the header?
- how do i compile a file with plugin stuff?
- Error when compiling simple LLVM example with Mingw
- Ant debug and ant release failed
- Compilation failure in JNativeHook
- error: C1083: Cannot open include file: 'ui_MainWindow.h': No such file or directory, Qt Creator
- Netbeans not using available memory during compilation
Related Questions in HEADER-FILES
- llvm headers do not compile under msvc 2013
- How to add a c++ header file in "gedit" editor?
- Combine Fortran .for and .f90 include header files
- Internal vs External Include Guards
- when we define a class member function in header file of that class then inline keyword must be used. why?
- What's the benefit for a C source file include its own header file
- How to share same header files between kernel modules and userspace applications.
- Missing headers for kernel in bzImage loaded on qemu
- How to access a variable which is declare in namespace into another cpp file
- Header file included only once in entire program?
- Library tries to include <string.h> but includes "string.h" from my project, how to prevent?
- Including External cpp file in OpenCV cpp Code
- How can I use the tool 'Include What You Use' together with CMake to detect unused headers?
- Why crc32 value require -lz
- Can Lint resolve the include path of Header Files
Related Questions in PRECOMPILE
- Rails 4 - NO manifest.json after assets precompile on production server
- How to define and use precompiled variable in delphi directives
- Cannot set "compile" flag to true when using custom precompilation
- nothing changes when making change in assets fiels
- Precomopiling files doesnt work fine
- Sprockets require asset over HTTP
- Getting ExecJS when compiling rassets:precompile against production
- Can you use a code compiler to merge HTML components?
- Sass - SyntaxError: Not a valid CSS value
- asp.net 4 precompile utility and classic asp files
- Asset Precompile on Amazon Linux
- Why use ASSET_PATH over Image-url when linking images in css in rails
- underscore.js precompiled templates using
- Why do I have to precompile my assets in development?
- Pre Compiling HTML files for publication as static files
Trending Questions
- UIImageView Frame Doesn't Reflect Constraints
- Is it possible to use adb commands to click on a view by finding its ID?
- How to create a new web character symbol recognizable by html/javascript?
- Why isn't my CSS3 animation smooth in Google Chrome (but very smooth on other browsers)?
- Heap Gives Page Fault
- Connect ffmpeg to Visual Studio 2008
- Both Object- and ValueAnimator jumps when Duration is set above API LvL 24
- How to avoid default initialization of objects in std::vector?
- second argument of the command line arguments in a format other than char** argv or char* argv[]
- How to improve efficiency of algorithm which generates next lexicographic permutation?
- Navigating to the another actvity app getting crash in android
- How to read the particular message format in android and store in sqlite database?
- Resetting inventory status after order is cancelled
- Efficiently compute powers of X in SSE/AVX
- Insert into an external database using ajax and php : POST 500 (Internal Server Error)
Popular Questions
- How do I undo the most recent local commits in Git?
- How can I remove a specific item from an array in JavaScript?
- How do I delete a Git branch locally and remotely?
- Find all files containing a specific text (string) on Linux?
- How do I revert a Git repository to a previous commit?
- How do I create an HTML button that acts like a link?
- How do I check out a remote Git branch?
- How do I force "git pull" to overwrite local files?
- How do I list all files of a directory?
- How to check whether a string contains a substring in JavaScript?
- How do I redirect to another webpage?
- How can I iterate over rows in a Pandas DataFrame?
- How do I convert a String to an int in Java?
- Does Python have a string 'contains' substring method?
- How do I check if a string contains a specific word?
You've asked two distinct questions:
does the boost code compile twice? Yes it does. The net effect is that compilation time is probably a little longer as the compiler has to digest all the headers for each compilation unit.
the binary size is double? No it probably does not, but that will come down to your choice of optimisation flags. A template instantiated in unit A will notionally share the same implementation code as one instantiated in unit B with exact same type parameters.
Whether it actually shares the same code will depend on whether your optimisation flags permit inlining of the template implementation. If you have allowed inlining and the compiler has chosen to do it then your binary size will increase as the compiler places the template implementation inline with your code in order to achieve your stated optimisation goals.
Inlining is never possible with a binary-only library and so this is one reason why your binary size could grow when using header-only libraries.
Here's an example to show how gcc shares template implementation when inlining is not enabled:
a.cpp
b.cpp
m.cpp
compilation
analysis of objdump
Note how the same implementation of
push_backis used (location 400976) even though it was compiled into completely separate compilation units.