optimize template-heavy project with duplicate code removal

Hi, our project heavily uses c++ template, and the resulting executable is almost 1.5G Bytes, which is too big to be acceptable. Adding -O2 or -Os does not seem helping. Is there any way (like link option, etc) to reduce the size?

debug or non-debug build?

& no, for a full release build, measuring the final executable size, there’s not much you can do with the compiler.

you can try to factor common portions out of your templates (eg: remove template parameters where possible - if, for example, a member function of a class template doesn’t need all the template parameters - pull it out into a standalone function template that takes fewer template parameters, and call it from the member one)

Thanks, David. The build type is Debug. Today I tried removing the debug info (-g), the size of the executable could be cut 90%, to around 100MB, which looks not bad. Do you know whether there is a way to separate debug info file from the executable file on Linux? Mainly our code is already there, refactoring might require big effort… Also, does clang support -fno-implicit-templates? if yes, maybe we could use it to eliminate duplicate template instances to control the final size.

Thanks, David. The build type is Debug. Today I tried removing the debug
info (-g), the size of the executable could be cut 90%, to around 100MB,
which looks not bad. Do you know whether there is a way to separate debug
info file from the executable file on Linux?

Yep, -gsplit-dwarf - latest versions of GDB can cope with this debug info

You can also compress the debug info: -Wa,--compress-debug-sections

If you want linked debug info (rather than split debug info), consider
enabling type units to deduplicate debug info in your final executable
(-fdebug-types-section).

Mainly our code is already there, refactoring might require big effort..
Also, does clang support -fno-implicit-templates? if yes, maybe we could
use it to eliminate duplicate template instances to control the final size.

Not sure, off hand, whether Clang supports that.

That’s very helpful. Thanks a lot. I will try them out.

By the way, when linking two libraries, say, they both instantiate classes from the same template class (e.g. defined in a ‘common’ component), into an executable, will the linker remove the duplicate class instance?

That's very helpful. Thanks a lot. I will try them out.

By the way, when linking two libraries, say, they both instantiate classes
from the same template class (e.g. defined in a 'common' component), into
an executable, will the linker remove the duplicate class instance?

The linker will remove the duplicate code, but not the duplicate debug info
(unless you use -fdebug-types-section - which will actually make your
object files a little bigger, but the executable will be smaller since the
duplicates will be removed)

I see. Thank you very much, David.