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 ответов

18 просмотров

Ну формально это просто условно такой 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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта