Задать вопрос
Lite_stream
@Lite_stream

Header-only. Страдает ли размер бинарника?

Правильно ли я понимаю, что при наличии реализации методов в заголовочных файлах будет страдать лишь время компиляции, а на размер бинарника это никак не повлияет ?

Ну и в частости тогда будет уместен вопрос: раздувается ли размер бинарника из-за большого количества шаблонов? Так как их нужно имплементировать хедерах

Согласно первому комменту к подобному вопросу вроде бы так и есть, но хотелось бы уточнений :)
  • Вопрос задан
  • 136 просмотров
Подписаться 1 Простой 5 комментариев
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
Для шаблонов Си++ в линкеры пришлось добавлять специальное исключение — ведь расшаблоненные функции будут повторяться в каждом имеющемся объектном файле.

Теста ради сделал такой проект

// MAIN.CPP
#include <iostream>

#include "tmpl.h"

void doFile1();

int main()
{
    const char* x = "main";
    outThing(x);
    doFile1();
    return 0;
}

// FILE1.CPP
#include "tmpl.h"

void doFile1()
{
    const char* x = "doFile1";
    outThing(x);
}


// TMPL.H
#pragma once

#include <iostream>

template <class T>
void outThing(const T& x)
{
    std::cout << "The thing is " << x << std::endl;
}


Для чего x — при расшаблонивании появилось outThing(char[5]&) и соответстсвенно char[8]&.
А теперь дамп линкера
Discarded input sections

 .text$_Z8outThingIPKcEvRKT_
                0x0000000000000000       0x50 debug/main.o

Linker script and memory map

.text$_Z8outThingIPKcEvRKT_
                0x0000000140002900       0x50 debug/file1.o
                0x0000000140002900                void outThing<char const*>(char const* const&)

Ну и ещё парочка структур для раскрутки стека и подстановки адресов…


Так что даже при -O0 оно не будет ничего дублировать. Да и логикой понятно: что дублировать, что не дублировать — один хрен потребуется специальная логика, и разницы мало.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
BacCM
@BacCM
C++ почти с рождения
Первый вопрос нет.
По второй части. Размер бинарника "страдает" только от того сколько вариантов инстанцирования шаблона будет в коде.

грубо говоря:

template <class T> 
T foo (T t)
{
  return t;
}
/// вызовы гдет-то.

foo(10); /// увеличивает размер бинарника генерится код int foo(int)
foo(10.0); /// увеличивает размер бинарника генерится код double foo(double)
foo(1); /// не увеличивает размер бинарника генерится используется код int foo(int)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы