powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Много кода в заголовке
23 сообщений из 23, страница 1 из 1
Много кода в заголовке
    #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
Много кода в заголовке
    #39746943
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

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

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

У шаблонных функций отдельный тип символа для линкера, который который как раз для этого и ввели.
...
Рейтинг: 0 / 0
Много кода в заголовке
    #39746963
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя ошибки дублей могут быть при специализации в хедерах если не указан inline
...
Рейтинг: 0 / 0
Много кода в заголовке
    #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
Много кода в заголовке
    #39746972
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вобщем теперь когда я понял что нужно сделать, ответ на исходный вопрос такой:
Если шаблон был введен только чтобы убрать ошибку дубликатов при связывании то просто используйте inline.
Потому что это тоже самое.
Код: plaintext
1.
2.
3.
4.
static inline int foo(int x)
{
   // Длинная портянка кода здесь
}
...
Рейтинг: 0 / 0
Много кода в заголовке
    #39746978
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyЕсли шаблон был введен только чтобы убрать ошибку дубликатов при связывании то просто
используйте inline.

Ошибка меня не волнует, меня волнует размножение кода, который будет вызываться из 100500
мест. Хочется single instantiation, но я не уверен будет ли оно работать без шаблонов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Много кода в заголовке
    #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
Много кода в заголовке
    #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
Много кода в заголовке
    #39747027
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NekZушла пора разных #ifdef'ов для этого.
В CentOS 7 до сих пор компилятор только С++11.
Так что не ушла. Здравствуй #ifdef! )))
...
Рейтинг: 0 / 0
Много кода в заголовке
    #39747051
a.guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyNekZушла пора разных #ifdef'ов для этого.
В CentOS 7 до сих пор компилятор только С++11.В CentOS есть devtoolset.
...
Рейтинг: 0 / 0
Много кода в заголовке
    #39747056
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyNekZушла пора разных #ifdef'ов для этого.
В CentOS 7 до сих пор компилятор только С++11.
Так что не ушла. Здравствуй #ifdef! )))
Возможно я брешу и даже с C++11 это доступно. Ты бы проверил для начала.
...
Рейтинг: 0 / 0
Много кода в заголовке
    #39747160
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovAnatoly MoskovskyЕсли портянка в шаблоне длинная то он инлайниться не будет безо всяких трюков. И тогда
линковщик уберет дубликаты.

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


ТОЧНО.
(но это неточно).
...
Рейтинг: 0 / 0
Много кода в заголовке
    #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
Много кода в заголовке
    #39747165
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyDimitry Sibiryakov,

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

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


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