|
Компиляция шаблонов
|
|||
---|---|---|---|
#18+
Знатоки С++, снова обращаюсь к вам за помощью. Пока только начинаю знакомиться с шаблонами, так что возник такой вопрос, буду благодарен, если кто на пальцах объяснит, как это работает. Вот есть шаблонный класс vector, и есть у него оператор сравнения <. Делаем, напрмер, так: Код: plaintext 1. 2. 3. 4. 5.
И все работает. А вот если попробовать сравнить векторы, в которых лежат объекты, не определяющие оператор сравнения, то возникнет ошибка компиляции. Так вот я не могу понять, как это работает. Ведь если использовать вектор с несравнимыми элементами, но не вызывать сравнение, то никаких ошибок не возникает. Но ведь оператор сравнения там все равно должен быть определен, и компилятор должен об него споткнуться. Получается, vector компилируется не полностью весь сразу, а по частям? То есть, его оператор < не компилируется, если нигде не вызывается и поэтому в этом случае ошибок не возникает? Или это как-то по другому устроено? Сам я, ввиду скудных знаний С++, в страшных исходниках стандартной библиотеки пока не могу разобраться. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2018, 15:38 |
|
Компиляция шаблонов
|
|||
---|---|---|---|
#18+
Ржавый гвоздьПолучается, vector компилируется не полностью весь сразу, а по частям? Шаблоны это всего лишь разновидность макросов. Так что да, они разворачиваются и компилируются только в используемой части. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2018, 15:54 |
|
Компиляция шаблонов
|
|||
---|---|---|---|
#18+
Ржавый гвоздь, Шаблон компилируется только в той части, которая используется. А именно - компилируются только функции шаблона которые где либо вызываются и только шаблонные классы, которые где либо инстанцируются. Если функция(шаблон) не вызывается, то она не компилируется, но при этом производится ее синтаксический разбор, т.е. она должна быть синтаксически корректным (например не должно быть пропущенных ";" и т.п. ). Это называется SFINAE. Соответственно оператор "<" для шаблона vector будет скомпилирован только если вы сравниваете вектора. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2018, 16:01 |
|
Компиляция шаблонов
|
|||
---|---|---|---|
#18+
Ржавый гвоздь, операторы сравнения для векторов — это отдельные шаблонные функции. Естественно, пока они не используются, то не инстанциируются. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2018, 17:09 |
|
Компиляция шаблонов
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyШаблон компилируется только в той части, которая используется. А именно - компилируются только функции шаблона которые где либо вызываются и только шаблонные классы, которые где либо инстанцируются. Если функция(шаблон) не вызывается, то она не компилируется, но при этом производится ее синтаксический разбор, т.е. она должна быть синтаксически корректным (например не должно быть пропущенных ";" и т.п. ). Это называется SFINAE.SFINAE называется не это. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2018, 17:09 |
|
Компиляция шаблонов
|
|||
---|---|---|---|
#18+
a guestРжавый гвоздь, операторы сравнения для векторов — это отдельные шаблонные функции. Естественно, пока они не используются, то не инстанциируются. Да, но ошибки нет не потому что они отдельные :) a guestSFINAE называется не это. Ну, да, SFINAE не совсем то же самое. Но непосредственно связанное свойство. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2018, 17:31 |
|
Компиляция шаблонов
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyДа, но ошибки нет не потому что они отдельные :) То есть, получается, компилируются только те функции шаблонного класса, которые где-либо вызываются? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2018, 18:34 |
|
Компиляция шаблонов
|
|||
---|---|---|---|
#18+
Ржавый гвоздьТо есть, получается, компилируются только те функции шаблонного класса, которые где-либо вызываются? Да. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.05.2018, 18:49 |
|
Компиляция шаблонов
|
|||
---|---|---|---|
#18+
Ржавый гвоздьAnatoly MoskovskyДа, но ошибки нет не потому что они отдельные :) То есть, получается, компилируются только те функции шаблонного класса, которые где-либо вызываются? Да, но грядут перемены и возможно после 20го года всё будет не так. (модули) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2018, 10:11 |
|
Компиляция шаблонов
|
|||
---|---|---|---|
#18+
MasterZivДа, но грядут перемены и возможно после 20го года всё будет не так. (модули) Модуль это всего лишь синтаксическое дерево куска кода без семантического разбора тех частей которые зависят от типа шаблона. Они не заставляют инстанцировать весь этот код - компилятор сам будет выбирать из модуля что инстанцировать. Поэтому с модулями будет то же самое. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2018, 10:51 |
|
Компиляция шаблонов
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyMasterZivДа, но грядут перемены и возможно после 20го года всё будет не так. (модули) Модуль это всего лишь синтаксическое дерево куска кода без семантического разбора тех частей которые зависят от типа шаблона. Они не заставляют инстанцировать весь этот код - компилятор сам будет выбирать из модуля что инстанцировать. Поэтому с модулями будет то же самое. Руку дашь на отсечение ? (можно также дать что-то другое...) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2018, 13:32 |
|
Компиляция шаблонов
|
|||
---|---|---|---|
#18+
Anatoly Moskovskya guestSFINAE называется не это. Ну, да, SFINAE не совсем то же самое. Но непосредственно связанное свойство.РАЗ ТУТ ТЕМКА ПРО ШАБЛОНЫ И SFINAE ЭТО ТИПА ПРО ШАБЛОНЫ ТОГДА ЗНАЧИТ НЕПОСРЕДСТВЕННО СВЯЗАННОЕ. Откуда substitution failure, если вообще никакого substitution никуда не происходит??? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.05.2018, 16:01 |
|
Компиляция шаблонов
|
|||
---|---|---|---|
#18+
Откуда substitution failure, если вообще никакого substitution никуда не происходит??? SFINAE это о другом вообще. Это правило, когда у тебя происходит инстанциирование шаблонов, и есть несколько возможных путей инстанциации (частичная специализация, или несколько возможных сигнатур функций, или несколько путей преобразования типов и так далее). Вот когда такое происходит, и в случае одного или нескольких путей инстанциации происходит ошибка компиляции, то вот это как раз случай SFINAE , такая ошибка не должна играть роль, и компилятором должны быть рассмотрены другие пути инстанциации нужных шаблонов. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2018, 14:22 |
|
Компиляция шаблонов
|
|||
---|---|---|---|
#18+
MasterZiv SFINAE это о другом вообще.Я это и пытался донести. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2018, 15:24 |
|
Компиляция шаблонов
|
|||
---|---|---|---|
#18+
SFINAE возможно потому, что возможно не делать подстановку реально неиспользованых функций. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.05.2018, 16:01 |
|
Компиляция шаблонов
|
|||
---|---|---|---|
#18+
сколько функций для шаблона сгенерирует компилятор? одну на все приложение или по одной в каждом скомпилированном файле? 1.h: Код: plaintext 1. 2. 3. 4. 5. 6. 7.
a.cpp: Код: plaintext 1. 2. 3. 4. 5. 6. 7.
b.cpp: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2021, 11:05 |
|
Компиляция шаблонов
|
|||
---|---|---|---|
#18+
tchingiz сколько функций для шаблона сгенерирует компилятор? одну на все приложение или по одной в каждом скомпилированном файле? При компиляции будет сгенерирована по копии функции в каждой единице трансляции. Далее компилятор проведет инлайнинг если посчитает нужным. Для копий которые не заинлайнены, при линковке произойдет случайный выбор одной из них и останется только она. Код же заинлайненых функций так и останется продублированным в каждом месте вызова. Что в принципе и ожидаемо. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.04.2021, 21:13 |
|
Компиляция шаблонов
|
|||
---|---|---|---|
#18+
Ржавый гвоздь Знатоки С++, снова обращаюсь к вам за помощью. Пока только начинаю знакомиться с шаблонами, так что возник такой вопрос, буду благодарен, если кто на пальцах объяснит, как это работает. Сразу книга что must be read: Вандервуд, Джосатис (Йозутис на самом деле) Шаблоны С++. Ржавый гвоздь Вот есть шаблонный класс vector, и есть у него оператор сравнения <. Делаем, напрмер, так: Код: plaintext 1. 2. 3. 4. 5.
И все работает. А вот если попробовать сравнить векторы, в которых лежат объекты, не определяющие оператор сравнения, то возникнет ошибка компиляции. Так вот я не могу понять, как это работает. Ведь если использовать вектор с несравнимыми элементами, но не вызывать сравнение, то никаких ошибок не возникает. Так и работает, самому вектору сравнение не нужно, и, если ты его не вызываешь, оно и не требуется. Ржавый гвоздь Но ведь оператор сравнения там все равно должен быть определен, и компилятор должен об него споткнуться. Не должен, не споткнётся. сравнение самому вектору не нужно. Другим контейнерам иногда нужно -- например, set, map (для ключа). А вектору сравнение элементов не нужно для работы. Ржавый гвоздь Получается, vector компилируется не полностью весь сразу, а по частям? Алло, с какого перепуга ты решил, что вектору нужна операция сравнения элементов, давай сначала с этим разберёмся. Ну да, "компилируется" по частам, это не секрет. на самом деле это не "компилируется", а "инстанциируется", инстанциируются элементы шаблона класса. Да, по частям, только те, что нужны. Но , блин, где ты нашёл, что для вектора нужна операция сравнения элементов? Где ты нашёл вообще операцию сравнения векторов? Нету её в С++... Ржавый гвоздь Получается, vector компилируется не полностью весь сразу, а по частям? То есть, его оператор < не компилируется, если нигде не вызывается и поэтому в этом случае ошибок не возникает? Или это как-то по другому устроено? Сам я, ввиду скудных знаний С++, в страшных исходниках стандартной библиотеки пока не могу разобраться. Да, именно так. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.04.2021, 00:10 |
|
Компиляция шаблонов
|
|||
---|---|---|---|
#18+
Ну так то операции сравнения для вектора есть. https://en.cppreference.com/w/cpp/container/vector/operator_cmp ... |
|||
:
Нравится:
Не нравится:
|
|||
29.04.2021, 05:07 |
|
|
start [/forum/topic.php?fid=57&msg=39638720&tid=2017222]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
45ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
69ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 182ms |
0 / 0 |