170 похожих чатов

Привет всем! // my_functions.h template<typename T> void foo(T t) {} // file_1.cpp #include "my_functions.h" foo(10); //

file_2.cpp
#include "my_functions.h"
foo(11);
Правильно ли я понимаю, что линковщик выбирает любое инстанцирование шаблонной функции и вставляет только его в исполняемый модуль?
Для шаблонных классов работает также?

28 ответов

14 просмотров

Ну формально это просто условно такой linkage

Да

Dmitry-Valakas Автор вопроса

нет, это уб

Denis P
нет, это уб

все там нормально

Vlad
все там нормально

ага, я почему-то думал что там определение а не инстанциирование

если честно до конца не понял вопрос, типо там же один и тот же тип, одно инстанцирование, не?

Vlad
нет, там два translation unit

ну да если в разных потоках компилирует, 2 раза инстанцирует, но всё ещё в чем проблема то?

Vlad
на два TU?

пора объяснять полностью что происходит. Итак, компилятор видит шаблон, видит что его нужно инстанцировать с T= int, грубо говоря пишет функцию inline void foo(int v) { }, далее т.к. это inline он в каждую единицу трансляции, которая использует функцию, подставляет static void foo(int v), тык? или че то не так

Kelbon
пора объяснять полностью что происходит. Итак, ком...

зачем эти типа inline, без типа, и прочее? Как происходит инстанциирование написано в стандарте

Denis P
один раз инстанциируется

Инстанцируется в каждом TU, где необходимо

Denis P
ну да

http://eel.is/c++draft/temp.inst#5.sentence-1

Vlad
http://eel.is/c++draft/temp.inst#5.sentence-1

про ту тут ничего нет

Denis P
про ту тут ничего нет

инстанциация в другом TU не делает ее доступной в нашем TU

Denis P
нет

Каждый .cpp компилируется отдельно и не знает ничего про существование каких-то других. Так что да, в каждом будет своё инстанцирование

Alexander Karaev
Каждый .cpp компилируется отдельно и не знает ниче...

если бы я был компилятором, то создавал бы какой то пул проинстанцированных версий шаблонов

Kelbon
пора объяснять полностью что происходит. Итак, ком...

для каждого TU: 1) компилятор видит шаблон 2) компилятор видит вызов 3) компилятор не находит определение 4) компилятор генерирует определение для вызова (2) из шаблона (1)

Vlad
для каждого TU: 1) компилятор видит шаблон 2) комп...

не ну типа какое то дерево там все такое и у каждого шаблона списочек че уже построено для него... грубо говоря

Kelbon
не ну типа какое то дерево там все такое и у каждо...

компиляция может идти на разных хостах

Denis P
это не так

А как же? Что отрицаем - раздельную компиляцию каждого .cpp или тот факт, что инстанцирует компилятор, а не линкер?

Denis P
это не так

TU не знают друг про друга до 8 фазы http://eel.is/c++draft/lex.phases#1.8

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

Обсуждают сегодня

Мужики и девушки, привет) в Вelphi xe7 в настройках во вкладке "Editor Options" далее " Color" есть список: "Elements", открыв который мы можем настраивать отображение разных...
Kraszx
14
Добрый вечер. Есть вопрос, а может и предложение. Был у меня диалог в другой группе о делфи и я задался вопросом: "А нельзя ли в делфи цвет //коментария и {комментария} сде...
Kraszx
24
Я вот подумал. SSE выполняет операции максимум с 64-битной точностью. А FPU - всегда с 80-битной. Разве не должно быть FPU точнее тогда?
The Bird of Hermes
13
как быть с принтером? такой подход прокатит?
zamtmn
12
Мдя, прикол, боевая сборка запускается (именно под отладчиком) после F9 примерно полторы минуты (97 секунд если быть точным). Начал копать - проблема детектится сразу - зависа...
Александр (Rouse_) Багель
38
Всем привет! Подскажи, пожалуйста, как передать в TComboBox сразу значение и id записи. На Delphi я делал так: ComboBox1.Items.AddObject('Какое-то значение', Pointer(id запис...
Евгений
13
Здравствуйте, вопрос по структурам данных. Были у вас случаи, когда пришлось писать деревья или двунаправленные списки?
/ /
50
Я не понимаю, это троллинг или что? Швабрика поддерживают, который буквально пишет на ассемблере взаимодействия с винапи. Я это ещё написал загрузчик и хоть что-то изучаю в о...
Shadow Akira
6
А вот это что за конструкция? Вернее, она тут нафига?
Serjone
10
Привет. Подскажите, как правильно сматчить лист фиксированного размера, чтобы компилятор не говорил мне о неполном паттерне? Допустим что-то такое [x', y'] = sort [x, y]?
Arseny
8
Карта сайта