![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Леопольд |
|
||||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Демонстарционный код был изменён в сторону большей наглядности.
Перед вызовом deleg переменная var из единицы трансляции где определенна функция main приобретает значение 1 Непосредственно после вызова deleg, переменная var получает значение 2 в той единице трансляции в которой определенна функция deleg. Никак не могу понять следующую аномалию test.h
test.cpp
second.cpp
результат (сборка VC 2005)
Почему var in deleg { inl_func } = 1, а var in deleg { sta_inl_func } = 2 ? Чем отличается статическая компоновка inline функций от статической компоновки static inline функций? ПРАВИЛЬНЫЙ ОТВЕТ: inline функции компонуются динамически если явно не указать обратное, т.е. static inline. Так же inline функции не подчиняются правилу ODR. Расхожее мнение что inline функции компонуются статически в корне неверно. Компилятор у VC 2005 - г о в н огадость. ---------------------------------------------- результат (сборка g++ 4.3.3 linux)
Это сообщение отредактировал(а) Леопольд - 20.6.2009, 10:48 -------------------- вопросов больше чем ответов |
||||||||||
|
|||||||||||
azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
это ответ на вопрос
он же "частичный ответ". Думаю дальше додумать будет несложно. Это сообщение отредактировал(а) azesmcar - 19.6.2009, 10:13 |
||||
|
|||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
из за ее расположения в хидере, у Вас получаются две переменные (по одной в каждой единице трансляции) тут разобрано подробнее : http://www.rsdn.ru/forum/cpp/2706624.1.aspx Это сообщение отредактировал(а) mes - 19.6.2009, 10:19 |
|||
|
||||
Леопольд |
|
||||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Да, я понимаю что у меня две переменные, этот пример сделан для наглядной демонстрации статической компоновки. Я не понимаю почему инлайн функция (без спецификатора static), вызываемая из другой единицы трансляции (при помощи делегирования) выводит значение переменной из той единицы трансляции где происходит вызов делегата а не из той, где делегат определён. Поправьте меня, если я не прав, и inline не подразумевает статическую компоновку. Если что, вопрос в самом низу первого поста... Добавлено @ 12:39
Прав ли я буду если скажу что inline как и static имеет internal linkage? Если да, то почему тогда они оперируют с разными инстансами переменной var хотя их вызов происходит одинаково, через делегата dyn_func? Этому я не "вижу" объяснения. Буду премного благодарен если кто-нибдь мне "разжуёт" Это сообщение отредактировал(а) Леопольд - 19.6.2009, 12:42 -------------------- вопросов больше чем ответов |
||||||||
|
|||||||||
azesmcar |
|
||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
static inline имеет internal linkage, inline - имеет external linkage. (добавлено для точности: тут речь идет о ваших функциях а не вообще)
теперь понятнее? Добавлено @ 13:49
нет, см. стандарт Это сообщение отредактировал(а) azesmcar - 19.6.2009, 14:15 |
||||||
|
|||||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Теперь всё встало на свои места, спасибо! Не стоит доверять всему подряд:
Для функций, объявленных как подставляемые (с ключевым словом inline), по умолчанию тоже применяется внутренняя компоновка. (с)http://www.rsdn.ru/forum/cpp/2706624.1.aspx Это сообщение отредактировал(а) Леопольд - 19.6.2009, 13:59 -------------------- вопросов больше чем ответов |
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
||||
|
||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Он не одинок. Мнение расхожее и встречалось мне во многих местах. Основная причина в том что определённые в теле класса функции считаются inline по умолчанию. Дабы не нарушать ODR. Так что не всё встало на свои места, увы. Теперь я не понимаю почему на inline не действует ODR? Ведь определение функции находится в хидере который включается в два модуля. Почему нет ошибки? Если попробовать перенести определение dyn_func в хидер то получим ошибку на этапе линковки... Это сообщение отредактировал(а) Леопольд - 19.6.2009, 14:14 -------------------- вопросов больше чем ответов |
|||
|
||||
azesmcar |
|
||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Леопольд
Вообще-то ключевое слово inline никак не влияет на linkage функции. Просто в вашем случае inline обявлена функция с external linkage. Речь идет о inl_func. В случае с sta_inl_func инлайнится функция с internal linkage.
так задуманно ![]()
Это сообщение отредактировал(а) azesmcar - 19.6.2009, 14:29 |
||||||
|
|||||||
Леопольд |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Я тоже пришёл к такому же выводу, правда только дедуктивно... Спасибо! Теперь даже сомнений не осталось.
![]() И всё же, ответ был найден в стандарте а не в the книгах ![]() Это сообщение отредактировал(а) Леопольд - 19.6.2009, 14:42 -------------------- вопросов больше чем ответов |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Стандарт мне цитировать легче чем книги. Еще надо вспомнить где и что написано. А самому писать неохота ![]() |
|||
|
||||
zim22 |
|
||||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
inline - это рекомендация/просьба компилятору. а встроит он или нет - дело его. Добавлено @ 15:10 что-то мне кажется, что в С++ это правило всё-равно нарушается. ведь можно же объявлять struct\class\union\enum структуру и функцию с одинаковым именем в одной области видимости.
*** azesmcar уже ответил на это ![]() Это сообщение отредактировал(а) zim22 - 19.6.2009, 15:12 |
||||
|
|||||
Леопольд |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Дело в том, что если бы это было не так, то нельзя было бы определять функции в теле класса. Было бы нарушено ODR. А так как extern inline функции не подвалстны ODR (при определённых условиях) то они идеальный кандидат на эту роль. А встроится эта функция, или нет, не имеет значения в этом контексте. -------------------- вопросов больше чем ответов |
||||
|
|||||
azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
...
Добавлено через 2 минуты и 27 секунд что я хотел сказать... функция может и не встроится, а может встроится в одном участке кода и не встроится в другом..но от этого она не перестанет быть инлайн функцией. |
||||
|
|||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
||||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |