Дело в STL, потому что это все шаблоны, которые он только добавляет к размеру, когда вы на самом деле используете. Если вы не используете метод, то этот метод не создается.
Но за вещи, которые вы используете, всегда будет стоить плата.
Но реальный вопрос, который вы должны задать. Будет ли размер больше или меньше вашей собственной реализации? Если вы не используете STL, что вы используете? Вы можете написать свои собственные, но это имеет свою цену. Это не нулевое пространство, оно не будет хорошо протестировано, и вы не будете следовать установленным передовым методам.
Так что на самом деле нет, это не раздувает ваш код.
Потому что добавление эквивалентной функциональности каким-либо другим методом добавит столько же кода, сколько просто не будет проверено.
В других сообщениях говорится, что код шаблона должен быть встроен или иметь несколько определений.
Это абсолютно НЕПРАВИЛЬНО .
Методы помечены как встроенные. Но это зависит от компилятора, если метод на самом деле встроен или нет. Встраивание компилятора достаточно сложное, чтобы встроить его только в том случае, если это поможет в использовании стратегии оптимизации.
Если не встроено, то копия метода будет сгенерирована в каждой единице компиляции, которая использует метод. Но ТРЕБОВАНИЕ для компоновщика C ++ заключается в том, что он должен удалять ВСЕ, но ОДНУ копию этих методов, когда приложение связано в исполняемый файл. Если компилятор не удалит лишние копии, он должен будет сгенерировать ошибку компоновщика с несколькими определениями.
Это легко показать:
Ниже показано, что:
- Метод _M_insert_aux () не встроен.
- Он размещается в обеих единицах компиляции.
- Что только одна копия метода находится в конечном исполняемом файле.
a.cpp
#include <vector>
void a(std::vector<int>& l)
{
l.push_back(1);
l.at(0) = 2;
}
b.cpp
#include <vector>
void b(std::vector<int>& l)
{
l.push_back(1);
l.at(0) = 2;
}
main.cpp
#include <vector>
void a(std::vector<int>&);
void b(std::vector<int>&);
int main()
{
std::vector<int> x;
a(x);
b(x);
}
Проверка
>g++ -c a.cpp
>g++ -c b.cpp
>nm a.o
<removed other stuff>
000000a0 S __ZNSt6vectorIiSaIiEE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPiS1_EERKi
<removed other stuff>
>nm b.o
<removed other stuff>
000000a0 S __ZNSt6vectorIiSaIiEE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPiS1_EERKi
<removed other stuff>
>c++filt __ZNSt6vectorIiSaIiEE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPiS1_EERKi
std::vector<int, std::allocator<int> >::_M_insert_aux(__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, int const&)
>g++ a.o b.o main.cpp
nm a.out | grep __ZNSt6vectorIiSaIiEE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPiS1_EERKi
00001700 T __ZNSt6vectorIiSaIiEE13_M_insert_auxEN9__gnu_cxx17__normal_iteratorIPiS1_EERKi