|
Много кода в заголовке
|
|||
---|---|---|---|
#18+
Насколько легитимен такой трюк для получения одного экземпляра функции в результирующем экзешнике при написании "библиотек в заголовках"? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2018, 19:47 |
|
Много кода в заголовке
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, Если портянка в шаблоне длинная то он инлайниться не будет безо всяких трюков. И тогда линковщик уберет дубликаты. Ну а оборачивание в функцию вообще врядли будет иметь какой либо эффект. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2018, 20:44 |
|
Много кода в заголовке
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyЕсли портянка в шаблоне длинная то он инлайниться не будет безо всяких трюков. И тогда линковщик уберет дубликаты. Точно уберёт? У меня было воспоминание, что он начнёт ругаться на многочисленное определение символа. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2018, 20:56 |
|
Много кода в заголовке
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, У шаблонных функций отдельный тип символа для линкера, который который как раз для этого и ввели. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2018, 21:34 |
|
Много кода в заголовке
|
|||
---|---|---|---|
#18+
Хотя ошибки дублей могут быть при специализации в хедерах если не указан inline ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2018, 21:42 |
|
Много кода в заголовке
|
|||
---|---|---|---|
#18+
OK: Код: plaintext 1. 2. 3. 4. 5. 6.
multiple definition: Код: plaintext 1. 2. 3. 4. 5. 6.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2018, 21:44 |
|
Много кода в заголовке
|
|||
---|---|---|---|
#18+
Вобщем теперь когда я понял что нужно сделать, ответ на исходный вопрос такой: Если шаблон был введен только чтобы убрать ошибку дубликатов при связывании то просто используйте inline. Потому что это тоже самое. Код: plaintext 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2018, 22:00 |
|
Много кода в заголовке
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyЕсли шаблон был введен только чтобы убрать ошибку дубликатов при связывании то просто используйте inline. Ошибка меня не волнует, меня волнует размножение кода, который будет вызываться из 100500 мест. Хочется single instantiation, но я не уверен будет ли оно работать без шаблонов. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2018, 22:07 |
|
Много кода в заголовке
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovХочется single instantiation, но я не уверен будет ли оно работать без шаблонов. У шаблонов и inline одно и то же в этом плане. Inline вовсе не означает обязательный инлайн. Компилятор сам решает. Кстати я там неверно вверху написал Код: plaintext 1.
Надо без static. Иначе в каждом модуле будет своя копия. Код: plaintext 1.
А что касается гарантированного одного экземпляра то в GCC это можно сделать так: Код: plaintext 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2018, 22:31 |
|
Много кода в заголовке
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyА что касается гарантированного одного экземпляра то в GCC это можно сделать так: Код: plaintext 1. 2. 3. 4.
Начиная с C++14 можно писать так Код: plaintext 1. 2. 3. 4.
Компиляторы обязаны игнорить атрибуты которые не распознают, и даже не кидать ворнингов. gcc и clang прожуют этот аттрибут, msvc просто проигнорит его, следовательно ушла пора разных #ifdef'ов для этого. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2018, 23:30 |
|
Много кода в заголовке
|
|||
---|---|---|---|
#18+
NekZушла пора разных #ifdef'ов для этого. В CentOS 7 до сих пор компилятор только С++11. Так что не ушла. Здравствуй #ifdef! ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2018, 00:08 |
|
Много кода в заголовке
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyNekZушла пора разных #ifdef'ов для этого. В CentOS 7 до сих пор компилятор только С++11.В CentOS есть devtoolset. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2018, 05:16 |
|
Много кода в заголовке
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyNekZушла пора разных #ifdef'ов для этого. В CentOS 7 до сих пор компилятор только С++11. Так что не ушла. Здравствуй #ifdef! ))) Возможно я брешу и даже с C++11 это доступно. Ты бы проверил для начала. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2018, 06:53 |
|
Много кода в заголовке
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovAnatoly MoskovskyЕсли портянка в шаблоне длинная то он инлайниться не будет безо всяких трюков. И тогда линковщик уберет дубликаты. Точно уберёт? У меня было воспоминание, что он начнёт ругаться на многочисленное определение символа. ТОЧНО. (но это неточно). ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2018, 10:25 |
|
Много кода в заголовке
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovНасколько легитимен такой трюк для получения одного экземпляра функции в результирующем экзешнике при написании "библиотек в заголовках"? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
А что бы просто не объявить функцию inline -- не понятно. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2018, 10:25 |
|
Много кода в заголовке
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyDimitry Sibiryakov, У шаблонных функций отдельный тип символа для линкера , который который как раз для этого и ввели. Который? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2018, 10:27 |
|
Много кода в заголовке
|
|||
---|---|---|---|
#18+
MasterZivКоторый? weak ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2018, 11:32 |
|
Много кода в заголовке
|
|||
---|---|---|---|
#18+
NekZВозможно я брешу и даже с C++11 это доступно. Ты бы проверил для начала. А мне оно зачем ? ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2018, 11:33 |
|
Много кода в заголовке
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyNekZВозможно я брешу и даже с C++11 это доступно. Ты бы проверил для начала. А мне оно зачем ? ))) Чтобы уже начать пользоваться атрибутами, некоторые из которых могут быть очень полезными, например pure . Заметь, шланг вызывает функцию один раз, а msvc дважды. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2018, 11:57 |
|
Много кода в заголовке
|
|||
---|---|---|---|
#18+
a.guestВ CentOS есть devtoolset. Можно уткнуться в то что системная какая-нибудь либа не будет работать с бинарниками собранными под новую версию этой либы. Короче гемор еще тот. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.12.2018, 19:17 |
|
Много кода в заголовке
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyХотя ошибки дублей могут быть при специализации в хедерах если не указан inlineУказание ключевых слов static inline позволяет инлайнить функцию со связыванием internal в той единице трансляции, в которую включен заголовок с этой функцией. Т.е. никаких дублей не должно быть. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2018, 09:51 |
|
Много кода в заголовке
|
|||
---|---|---|---|
#18+
rdb_devТ.е. никаких дублей не должно быть. static как раз создает дубли. Просто ошибок не будет. А эта тема про то чтобы вообще не было дублей )) ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2018, 14:07 |
|
|
start [/forum/topic.php?fid=57&msg=39746978&tid=2017701]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
27ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
others: | 259ms |
total: | 384ms |
0 / 0 |