Size: a a a

2020 December 07

A

Alex in pro.cxx
Побитый Кирпич
inline это external linkage - адрес один
по-моему, наоборот, Андрей правильно написал. inline означает, что несколько реализаций функции с одинаковым именем - не ошибка
источник

АР

Андрей Руссков... in pro.cxx
magras
Окей, почему существует ODR и к чему приводит его нарушение?
inline как раз подавляет ошибку ODR, у тебя в итоге будет несколько раз инстанцирован один метод. Гарантии что метод, инстанцированный несколько раз в разных TU, склеится линкером, нет
источник

ПК

Побитый Кирпич... in pro.cxx
Alex
по-моему, наоборот, Андрей правильно написал. inline означает, что несколько реализаций функции с одинаковым именем - не ошибка
Со static (internal linkage) тоже будет не ошибка, но со static будет по одному экземпляру в каждом TU (со своим адресом каждый), а с inline будет в итоге одна функция, как если бы ты вручную писал extern и реализацию в cpp
источник

АР

Андрей Руссков... in pro.cxx
тем более что одинаковый по сигнатуре метод может быть разным в разных TU
источник

m

magras in pro.cxx
Андрей Руссков
inline как раз подавляет ошибку ODR, у тебя в итоге будет несколько раз инстанцирован один метод. Гарантии что метод, инстанцированный несколько раз в разных TU, склеится линкером, нет
Нет, на практике нарушение ODR приводит к тому что будет выбран произвольный инстанс из всех и останется только он.
источник

ПК

Побитый Кирпич... in pro.cxx
Андрей Руссков
тем более что одинаковый по сигнатуре метод может быть разным в разных TU
Тогда это будет нарушение ODR, так что слова про то что inline что то там подавляет это бред
источник

ПК

Побитый Кирпич... in pro.cxx
inline точно так же должен следовать ODR
источник

АР

Андрей Руссков... in pro.cxx
а, понял, я не прав
источник

A

Alex in pro.cxx
static требует выполнения ODR только в пределах одного TU, а не глобально, а эффект inline глобальный
источник

AS

Anatoly Shirokov in pro.cxx
Alex
static требует выполнения ODR только в пределах одного TU, а не глобально, а эффект inline глобальный
Explanation

An inline function or inline variable (since C++17) has the following properties:

The definition of an inline function or variable (since C++17) must be reachable in the translation unit where it is accessed (not necessarily before the point of access).

An inline function or variable (since C++17) with external linkage (e.g. not declared static) has the following additional properties:

There may be more than one definition of an inline function or variable (since C++17) in the program as long as each definition appears in a different translation unit and (for non-static inline functions and variables (since C++17)) all definitions are identical. For example, an inline function or an inline variable (since C++17) may be defined in a header file that is #include'd in multiple source files.

It must be declared inline in every translation unit.

It has the same address in every translation unit.
источник

A

Alex in pro.cxx
Спасибо, всё соответствует моему пониманию, но про same address не знал. Это означает, что если где-то в одном TU берётся адрес inline функции, она уже нигде не сможет заинлайниться?
источник

ПК

Побитый Кирпич... in pro.cxx
Alex
Спасибо, всё соответствует моему пониманию, но про same address не знал. Это означает, что если где-то в одном TU берётся адрес inline функции, она уже нигде не сможет заинлайниться?
В других местах сможет
источник

АР

Андрей Руссков... in pro.cxx
кстати да, при динамической линковке-то...
источник

A

Alex in pro.cxx
т. е. он должен быть одинаков только между теми TU, которые фактически выполняют операцию взятия адреса?
источник

ПК

Побитый Кирпич... in pro.cxx
Alex
т. е. он должен быть одинаков только между теми TU, которые фактически выполняют операцию взятия адреса?
Нет, почему ты так решил?
источник

m

magras in pro.cxx
magras
Нет, на практике нарушение ODR приводит к тому что будет выбран произвольный инстанс из всех и останется только он.
Собственно я полагаю что ODR просто легализует такое поведение линкера. Пока ODR не нарушен, он может взять любой инстанс и все будет работать. Если нарушили мы будем наблюдать то что я описал выше.
источник

A

Alex in pro.cxx
потому что я не вижу третьей альтернативы с учётом требования стандарта, что адрес inline функции везде одинаков
источник

A

Alex in pro.cxx
он не может быть одинаков, если у функции вообще нет адреса (она заинлайнилась)
источник

ПК

Побитый Кирпич... in pro.cxx
Alex
потому что я не вижу третьей альтернативы с учётом требования стандарта, что адрес inline функции везде одинаков
А в чем проблема выпилить функцию (заинлайнить) там где нет взятия адреса?
источник

ПК

Побитый Кирпич... in pro.cxx
А где есть взятие сделать вызов функции
источник