Почему CImg может достичь такого эффекта? - PullRequest
2 голосов
/ 18 июля 2010

Компиляция выполняется на лету: действительно используются только функциональные возможности CImg по вашей программе компилируются и появляются в скомпилированном исполняемом файле программа. Это приводит к очень компактным код, без каких-либо неиспользованных вещей.

Кто-нибудь знает принцип?

Ответы [ 3 ]

6 голосов
/ 18 июля 2010

CImg - это библиотека только для заголовков, и они свободно используют шаблоны, на что они ссылаются.

Если они использовали какую-то предварительно скомпилированную библиотеку (.dll / .lib / .a/.so) файл библиотеки должен содержать всю библиотеку CImg, независимо от того, какие ее биты вы на самом деле используете.

В случае статически связанной библиотеки (.lib или.a) компоновщик может затем удалить неиспользуемые символы, но это может зависеть от настроек оптимизации.

Когда вся библиотека включена в один или два заголовка, она только фактически компилируетсякогда вы #include это, и поэтому он является частью того же процесса компиляции, что и остальная часть вашей программы, и компилятор может легко определить, какие части библиотеки используются, а какие нет.

А поскольку API CImg использует шаблоны, для функций, которые никогда не вызываются, не генерируется код.

Хотя они немного перепродали его, потому что, как указывают другие ответы, неиспользованные символы обычно удаляются в любом случае .

2 голосов
/ 18 июля 2010

Для меня это звучит как стандартное поведение - компоновщик C ++ обычно отбрасывает любые неиспользуемые ссылки на библиотеки, а не включает не вызываемый код.Точно так же оптимизированная сборка не будет включать не вызываемый код.

0 голосов
/ 18 июля 2010

Это похоже на команду компоновщика Eliminate Unreferenced Data (/OPT:REF) от MSVC, GCC должен иметь что-то подобное, тоже это

...