Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> определение функции в классе 
V
    Опции темы
FCM
Дата 2.11.2009, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 461
Регистрация: 30.3.2009

Репутация: нет
Всего: 9



Вот цитата с 
http://msdn.microsoft.com/en-us/library/z8y1yy88(VS.71).aspx

Functions that are declared as inline, and that are not class member functions, have internal linkage unless otherwise specified.

Что же есть на самом деле?
PM MAIL   Вверх
bsa
Дата 2.11.2009, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



имеется в виду, думаю, то что inline функции не члены классов не экспортируются из dll библиотек.
PM   Вверх
17dufa
Дата 3.11.2009, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 2.3.2006

Репутация: 3
Всего: 5



azesmcar, мое понимание все уменьшается и уменьшается. итак inline - это рекомендация компилятору. он имеет право на нее покласть и в целом обрабатывает inline функции обычным образом, хотя и старается по возможности встроить вызовы таких функций. тогда вопрос - почему нет ошибок линковки вида "already defined"? может все-таки не совсем обычным образом, какой-то флажок что ли ставит или еще чего такое незаметное делает, чтоб линкер с ума не сходил?
и возвращаясь в вопросу о dll. 
в этом объявлении
Код

__declspec(dllexport)  inline int а();

на inline будет положено в 100% случаев (мелкософт такое компилит даже без варнингов)?
PM MAIL   Вверх
azesmcar
Дата 3.11.2009, 12:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(17dufa @  3.11.2009,  11:15 Найти цитируемый пост)
тогда вопрос - почему нет ошибок линковки вида "already defined"? 

потому что inline функция должна быть объявлена во всех единицах трансляции, в которых используется, вот она и объявлена, все соответствует стандарту, в чем проблема?

Цитата(17dufa @  3.11.2009,  11:15 Найти цитируемый пост)
может все-таки не совсем обычным образом, какой-то флажок что ли ставит или еще чего такое незаметное делает, чтоб линкер с ума не сходил?

не знаю что там конкретно делает компилятор, флажок или что-то там другое, но ошибки он не должен выдавать.

Цитата(17dufa @  3.11.2009,  11:15 Найти цитируемый пост)
на inline будет положено в 100% случаев 

нет, с чего вдруг?
PM   Вверх
mes
Дата 3.11.2009, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(17dufa @  3.11.2009,  10:15 Найти цитируемый пост)
, мое понимание все уменьшается и уменьшается. итак inline - это рекомендация компилятору. он имеет право на нее покласть и в целом обрабатывает inline функции обычным образом, хотя и старается по возможности встроить вызовы таких функций. 

Вы рассматриваете вопрос односторонне  :
  inline это не только рекомендация встраивания, а также указание способа компоновки функции, которое компилятор (а в последствии линкер) не могут проигнорировать.




--------------------
PM MAIL WWW   Вверх
xvr
Дата 3.11.2009, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



Цитата(bsa @ 2.11.2009,  17:25)
проще говоря, если компилятор видит inline функцию, то он обрабатывает ее обычным образом, плюс, в тех местах, где считает необходимым, он встраивает ее тело вместо вызова...

Уточнение для топикстартера - под 'обработкой обычным образом' понимается обработка с точки зрения синтаксиса и семантики языка С++. Оттранслированное тело функции (если компилятор такое создаст) будет помещено в объектный файл особым образом, что бы линкер не ругался на множественные определения таковых функций. 
Пример - 
Код

extern inline int func(int a) {return a+10;}

int (*f)(int) = &func;

Компиляция
Код

g++ -c -ffunction-sections ~/test.cxx

объектник
Код

test.o:     file format elf64-x86-64
test.o
architecture: i386:x86-64, flags 0x00000011:
HAS_RELOC, HAS_SYMS
start address 0x0000000000000000
 
Sections:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .text         00000000  0000000000000000  0000000000000000  00000040  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  1 .data         00000008  0000000000000000  0000000000000000  00000040  2**3
                  CONTENTS, ALLOC, LOAD, RELOC, DATA
  2 .bss          00000000  0000000000000000  0000000000000000  00000048  2**2
                  ALLOC
  3 .gnu.linkonce.t._Z4funci 0000000f  0000000000000000  0000000000000000  00000048  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, CODE, LINK_ONCE_DISCARD
  4 .eh_frame     00000048  0000000000000000  0000000000000000  00000058  2**3
                  CONTENTS, ALLOC, LOAD, RELOC, READONLY, DATA
  5 .note.GNU-stack 00000000  0000000000000000  0000000000000000  000000a0  2**0
                  CONTENTS, READONLY
  6 .comment      0000002d  0000000000000000  0000000000000000  000000a0  2**0
                  CONTENTS, READONLY
SYMBOL TABLE:
0000000000000000 l    df *ABS*  0000000000000000 test.cxx
0000000000000000 l    d  .text  0000000000000000 
0000000000000000 l    d  .data  0000000000000000 
0000000000000000 l    d  .bss   0000000000000000 
0000000000000000 l    d  .gnu.linkonce.t._Z4funci       0000000000000000 
0000000000000000 l    d  .eh_frame      0000000000000000 
0000000000000000 l    d  .note.GNU-stack        0000000000000000 
0000000000000000 l    d  .comment       0000000000000000 
0000000000000000 g     O .data  0000000000000008 f
0000000000000000  w    F .gnu.linkonce.t._Z4funci       000000000000000f _Z4funci
0000000000000000         *UND*  0000000000000000 __gxx_personality_v0
 
 
RELOCATION RECORDS FOR [.data]:
OFFSET           TYPE              VALUE 
0000000000000000 R_X86_64_64       _Z4funci
 
 
RELOCATION RECORDS FOR [.eh_frame]:
OFFSET           TYPE              VALUE 
0000000000000011 R_X86_64_64       __gxx_personality_v0
0000000000000028 R_X86_64_64       .gnu.linkonce.t._Z4funci
 
Обратите внимание на секцию 3:
Цитата

 3 .gnu.linkonce.t._Z4funci 0000000f  0000000000000000  0000000000000000  00000048  2**1
                  CONTENTS, ALLOC, LOAD, READONLY, CODE, LINK_ONCE_DISCARD

это оно и есть

PM MAIL   Вверх
azesmcar
Дата 3.11.2009, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



xvr

ну теперь я думаю вопросов поубавиться smile 

Это сообщение отредактировал(а) azesmcar - 3.11.2009, 12:42
PM   Вверх
17dufa
Дата 3.11.2009, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 2.3.2006

Репутация: 3
Всего: 5



azesmcar, 
Цитата(azesmcar @  3.11.2009,  12:08 Найти цитируемый пост)
потому что inline функция должна быть объявлена во всех единицах трансляции, в которых используется, вот она и объявлена, все соответствует стандарту, в чем проблема?

а компилятор позволяет не inline функции не объявлять в единицах трансляции, где они используются?

Цитата(azesmcar @  3.11.2009,  12:08 Найти цитируемый пост)

на inline будет положено в 100% случаев 

нет, с чего вдруг? 

я имею в виду работу компилятора по билду аппликайшена, использующего подобную библиотеку. не будет же компилятор бегать по длл в поисках объектного кода и пытаться его встроить?

xvr, полегчало. спасибо. Интересно какие правила использует линкер для устранения конфликта имен?


PM MAIL   Вверх
azesmcar
Дата 3.11.2009, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(17dufa @  3.11.2009,  13:07 Найти цитируемый пост)
а компилятор позволяет не inline функции не объявлять в единицах трансляции, где они используются?

имелось ввиду "определять" а не "объявлять".

Цитата(17dufa @  3.11.2009,  13:07 Найти цитируемый пост)

я имею в виду работу компилятора по билду аппликайшена, использующего подобную библиотеку. не будет же компилятор бегать по длл в поисках объектного кода и пытаться его встроить?

Ну эта инлайн функция еще может быть использована внутри самой библиотеки, это раз, и во вторых встраивать бинарный код никто не запрещает, другое дело что вряд ли кто либо этим будет заниматься. smile 
PM   Вверх
17dufa
Дата 3.11.2009, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 2.3.2006

Репутация: 3
Всего: 5



azesmcar, думаю известным мне компиляторам даже при сильном желании не удастся вытащить код из dll, так как эти самые dll указываются как параметры линкера, компилятору про них неизвестно. Но стандарт не запрещает написать компилятор, который тем не менее это сделает (и соответственно потребует доп параметров с указанием dll)?
Если в каждой единице трансляции будет определена inline функция, то я так понимаю для них будет использоваться статическое внутреннее связывание, и линкер по их поводу ваще не парится, то есть LINK_ONCE_DISCARD может как вариант приводить к тому, что подобные функции просто не будут включатся линкером в список имен. И далее рассуждая получаю, что статическое внешнее и динамические связывания для inline функций - это что-то из разряда юзанья их из lib и dll библиотек, то есть те самые случаи, когда слово inline по жизни не имеет эффекта (опустим тот факт, что оно могло оказать эффект при сборке этих lib, dll, меня в данный момент интересует аппликайшин, использующих эти библиотеки).
PM MAIL   Вверх
xvr
Дата 3.11.2009, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



По поводу вставки inline на этапе линковки. Почти все современные компиляторы имеют режим трансляции, когда при трансляции отдельных модулей генерируется только промежуточное представление модуля, которое помещается в объектный файл вместо (а иногда и вместе) с кодом. На этапе линковки это представление извлекается из объектников (всех) и скармливается компилятору. При таком подходе компилятор имеет возможность заинлайнить все и везде  smile 
NB. Режим этот у всех называется по разному, и включается разными опциями.

PM MAIL   Вверх
17dufa
Дата 3.11.2009, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 2.3.2006

Репутация: 3
Всего: 5



xvr, класс. прям чую как умнею. главное не рехнуться smile 
PM MAIL   Вверх
azesmcar
Дата 3.11.2009, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



17dufa

Почитай Герба Саттера - More Exceptional C++, там подробно написано про inline.

PM   Вверх
17dufa
Дата 3.11.2009, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 324
Регистрация: 2.3.2006

Репутация: 3
Всего: 5



azesmcar, как раз ищу его. после эйфории от первой части. наверно, стоит не мучаться, да распечатать то, что в электронном виде лежит.
PM MAIL   Вверх
bsa
Дата 3.11.2009, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



17dufa, когда ты подключаешь хидер (с inline функцией) к исходникам приложения, то компилятор может встроить ее тело... А может и не встроить. В любом случае, он сгененирует "невстроенный" вариант этой функции. Затем, на этапе линковки, все не нужные экземпляры невстроенной функции будут заменены на ту, что предоставляет dll.
PM   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0993 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.