Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Много кода в заголовке / 23 сообщений из 23, страница 1 из 1
12.12.2018, 19:47
    #39746924
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много кода в заголовке
Насколько легитимен такой трюк для получения одного экземпляра функции в результирующем
экзешнике при написании "библиотек в заголовках"?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
template <typename T = int>
int foo_templ(T x)
{
  // Длинная портянка кода здесь
}

static inline int foo(int x)
{
   return foo_templ(x);
}


Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
12.12.2018, 20:44
    #39746943
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много кода в заголовке
Dimitry Sibiryakov,

Если портянка в шаблоне длинная то он инлайниться не будет безо всяких трюков. И тогда линковщик уберет дубликаты.
Ну а оборачивание в функцию вообще врядли будет иметь какой либо эффект.
...
Рейтинг: 0 / 0
12.12.2018, 20:56
    #39746947
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много кода в заголовке
Anatoly MoskovskyЕсли портянка в шаблоне длинная то он инлайниться не будет безо всяких трюков. И тогда
линковщик уберет дубликаты.

Точно уберёт? У меня было воспоминание, что он начнёт ругаться на многочисленное
определение символа.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
12.12.2018, 21:34
    #39746959
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много кода в заголовке
Dimitry Sibiryakov,

У шаблонных функций отдельный тип символа для линкера, который который как раз для этого и ввели.
...
Рейтинг: 0 / 0
12.12.2018, 21:42
    #39746963
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много кода в заголовке
Хотя ошибки дублей могут быть при специализации в хедерах если не указан inline
...
Рейтинг: 0 / 0
12.12.2018, 21:44
    #39746964
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много кода в заголовке
OK:
Код: plaintext
1.
2.
3.
4.
5.
6.
template <typename T> void fff()
{
}
template <> inline void fff<int>()
{
}



multiple definition:
Код: plaintext
1.
2.
3.
4.
5.
6.
template <typename T> void fff()
{
}
template <> void fff<int>()
{
}
...
Рейтинг: 0 / 0
12.12.2018, 22:00
    #39746972
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много кода в заголовке
Вобщем теперь когда я понял что нужно сделать, ответ на исходный вопрос такой:
Если шаблон был введен только чтобы убрать ошибку дубликатов при связывании то просто используйте inline.
Потому что это тоже самое.
Код: plaintext
1.
2.
3.
4.
static inline int foo(int x)
{
   // Длинная портянка кода здесь
}
...
Рейтинг: 0 / 0
12.12.2018, 22:07
    #39746978
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много кода в заголовке
Anatoly MoskovskyЕсли шаблон был введен только чтобы убрать ошибку дубликатов при связывании то просто
используйте inline.

Ошибка меня не волнует, меня волнует размножение кода, который будет вызываться из 100500
мест. Хочется single instantiation, но я не уверен будет ли оно работать без шаблонов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
12.12.2018, 22:31
    #39746989
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много кода в заголовке
Dimitry SibiryakovХочется single instantiation, но я не уверен будет ли оно работать без шаблонов.
У шаблонов и inline одно и то же в этом плане.
Inline вовсе не означает обязательный инлайн. Компилятор сам решает.

Кстати я там неверно вверху написал
Код: plaintext
1.
static inline int foo(int x)


Надо без static. Иначе в каждом модуле будет своя копия.
Код: plaintext
1.
inline int foo(int x)



А что касается гарантированного одного экземпляра то в GCC это можно сделать так:
Код: plaintext
1.
2.
3.
4.
inline __attribute__ ((noinline)) int foo(int x)
{
   // Длинная портянка кода здесь
}
...
Рейтинг: 0 / 0
12.12.2018, 23:30
    #39747018
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много кода в заголовке
Anatoly MoskovskyА что касается гарантированного одного экземпляра то в GCC это можно сделать так:
Код: plaintext
1.
2.
3.
4.
inline __attribute__ ((noinline)) int foo(int x)
{
   // Длинная портянка кода здесь
}



Начиная с C++14 можно писать так
Код: plaintext
1.
2.
3.
4.
[[gnu::noinline]] inline int foo(int x)
{
   // Длинная портянка кода здесь
}


Компиляторы обязаны игнорить атрибуты которые не распознают, и даже не кидать ворнингов. gcc и clang прожуют этот аттрибут,
msvc просто проигнорит его, следовательно ушла пора разных #ifdef'ов для этого.
...
Рейтинг: 0 / 0
13.12.2018, 00:08
    #39747027
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много кода в заголовке
NekZушла пора разных #ifdef'ов для этого.
В CentOS 7 до сих пор компилятор только С++11.
Так что не ушла. Здравствуй #ifdef! )))
...
Рейтинг: 0 / 0
13.12.2018, 05:16
    #39747051
a.guest
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много кода в заголовке
Anatoly MoskovskyNekZушла пора разных #ifdef'ов для этого.
В CentOS 7 до сих пор компилятор только С++11.В CentOS есть devtoolset.
...
Рейтинг: 0 / 0
13.12.2018, 06:53
    #39747056
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много кода в заголовке
Anatoly MoskovskyNekZушла пора разных #ifdef'ов для этого.
В CentOS 7 до сих пор компилятор только С++11.
Так что не ушла. Здравствуй #ifdef! )))
Возможно я брешу и даже с C++11 это доступно. Ты бы проверил для начала.
...
Рейтинг: 0 / 0
13.12.2018, 10:25
    #39747160
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много кода в заголовке
Dimitry SibiryakovAnatoly MoskovskyЕсли портянка в шаблоне длинная то он инлайниться не будет безо всяких трюков. И тогда
линковщик уберет дубликаты.

Точно уберёт? У меня было воспоминание, что он начнёт ругаться на многочисленное
определение символа.


ТОЧНО.
(но это неточно).
...
Рейтинг: 0 / 0
13.12.2018, 10:25
    #39747163
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много кода в заголовке
Dimitry SibiryakovНасколько легитимен такой трюк для получения одного экземпляра функции в результирующем
экзешнике при написании "библиотек в заголовках"?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
template <typename T = int>
int foo_templ(T x)
{
  // Длинная портянка кода здесь
}

static inline int foo(int x)
{
   return foo_templ(x);
}




А что бы просто не объявить функцию inline -- не понятно.
...
Рейтинг: 0 / 0
13.12.2018, 10:27
    #39747165
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много кода в заголовке
Anatoly MoskovskyDimitry Sibiryakov,

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

Который?
...
Рейтинг: 0 / 0
13.12.2018, 11:32
    #39747230
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много кода в заголовке
MasterZivКоторый?
weak
...
Рейтинг: 0 / 0
13.12.2018, 11:33
    #39747231
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много кода в заголовке
NekZВозможно я брешу и даже с C++11 это доступно. Ты бы проверил для начала.
А мне оно зачем ? )))
...
Рейтинг: 0 / 0
13.12.2018, 11:57
    #39747266
NekZ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много кода в заголовке
Anatoly MoskovskyNekZВозможно я брешу и даже с C++11 это доступно. Ты бы проверил для начала.
А мне оно зачем ? )))
Чтобы уже начать пользоваться атрибутами, некоторые из которых могут быть очень полезными, например pure .
Заметь, шланг вызывает функцию один раз, а msvc дважды.
...
Рейтинг: 0 / 0
13.12.2018, 19:17
    #39747612
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много кода в заголовке
a.guestВ CentOS есть devtoolset.
Можно уткнуться в то что системная какая-нибудь либа не будет работать с бинарниками собранными под новую версию этой либы.
Короче гемор еще тот.
...
Рейтинг: 0 / 0
14.12.2018, 09:51
    #39747746
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много кода в заголовке
Anatoly MoskovskyХотя ошибки дублей могут быть при специализации в хедерах если не указан inlineУказание ключевых слов static inline позволяет инлайнить функцию со связыванием internal в той единице трансляции, в которую включен заголовок с этой функцией. Т.е. никаких дублей не должно быть.
...
Рейтинг: 0 / 0
14.12.2018, 14:07
    #39747929
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много кода в заголовке
rdb_devТ.е. никаких дублей не должно быть.
static как раз создает дубли. Просто ошибок не будет. А эта тема про то чтобы вообще не было дублей ))
...
Рейтинг: 0 / 0
17.12.2018, 15:14
    #39748994
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Много кода в заголовке
Anatoly Moskovsky, я имел в виду, что при линковке объедков не будет множественных определений одной и той же функции.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Много кода в заголовке / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]