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

15 просмотров

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

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

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

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
3
Карта сайта