Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
TierX
20 / 20 / 0
Регистрация: 28.02.2014
Сообщений: 138
#1

При вынесении определения всегда ли нужно указывать функцию как inline явно? - C++

22.07.2014, 11:21. Просмотров 1329. Ответов 46
Метки нет (Все метки)

Бьярни пишет
Если в описании класса функция-член определена, а не только описана, то она считается подстановкой. Это значит, например, что при
трансляции функций, использующихchar_stack из предыдущего примера, не будет использоваться
никаких операций вызова функций, кроме реализации операций вывода!
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
class char_stack { 
int size; 
char* top; 
char* s; 
public: 
  char_stack(int sz) { top=s=new char[size=sz]; } 
  ~char_stack() { delete[] s; } // деструктор
  void push(char c) { *top++ = c; } 
  void pop() { return *--top; } 
};

Далее
Функцию-член можно описать со спецификацией inline и вне описания класса:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
class char_stack { 
int size; 
char* top; 
char* s; 
public: 
char pop(); 
// ... 
}; 
inline char char_stack::pop() 
{ 
return *--top; 
}

Собсно при вынесении определения нужно всегда указывать функцию как inline явно? Или она всеже будет ею изначально как описано в начале. Слово можно както неоднозначно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.07.2014, 11:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос При вынесении определения всегда ли нужно указывать функцию как inline явно? (C++):

Зачем нужно явно указывать тип переменной? - C++
Всем привет! Объясните зачем нужно явно указывать тип переменной? Например в С++ это обязательно, а php нет. Просто говорят что не...

При вынесении кода в отдельную функцию выдает ошибки - C++
Здравствуйте, подскажите пожалуйсто где я тут что неправильно написал. Код работает если поставить его в маин, но вот как только я его...

Inline функции: как обеспечить уверенность в том, что заданный код, абсолютно всегда будет инлайниться? - C++
Вопрос заключается в следующем: как обеспечить уверенность в том, что приведенный ниже код, абсолютно всегда будет инлайниться? Это...

Как адаптировать функцию под inline - C++
Дана функция: bool Str(ifstream &f, const char *s) { char buff; return !(f.get(buff,...

Как избавиться от необходимости явно указывать тип в enum? - C#
Как сделать, чтобы для перечислений не нужно было явно указывать тип int? switch (direction) { case...

что нужно указывать в образце поиска при создании макроса - MS Access
Подскажите, пожалуйста, что нужно указывать в образце поиска при создании макроса, если я хочу с помощью кнопки отыскать нужную фамилию?

46
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
22.07.2014, 11:26 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
TierX, inline это только совет компилятору, однако в С++ правило, что функции определенные в классе являются inline по умолчанию позволяет определять функции в хедерах, без получения ошибок о множественном определении функции.
Так же указание inline при определении вне класса в хедер файле позволяет аналогичную вещь.
2
TierX
20 / 20 / 0
Регистрация: 28.02.2014
Сообщений: 138
22.07.2014, 11:38  [ТС] #3
Да но я не обэтом спрашивал) Если я пишу определение функции в сpp файле, функция будет inline без явного указания на это?
0
dzrkot
zzzZZZ...
519 / 349 / 53
Регистрация: 11.09.2013
Сообщений: 2,004
22.07.2014, 11:44 #4
Цитата Сообщение от TierX Посмотреть сообщение
Да но я не обэтом спрашивал) Если я пишу определение функции в сpp файле, функция будет inline без явного указания на это?
если часто вызывается то вроде как да, компилятор сам решает
0
TierX
20 / 20 / 0
Регистрация: 28.02.2014
Сообщений: 138
22.07.2014, 11:45  [ТС] #5
Хм значит если в хедере написать описание класа с вынесением определения его функций как inline в этом же хедере, то никаких ошибок при исползовании такого хедера не будет?
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
22.07.2014, 12:00 #6
Цитата Сообщение от TierX Посмотреть сообщение
то никаких ошибок при исползовании такого хедера не будет?
Не будет ошибок множественного определения. Насчет никаких это уже более широкий вопрос
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
22.07.2014, 12:02 #7
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от TierX Посмотреть сообщение
Если я пишу определение функции в сpp файле, функция будет inline без явного указания на это?
Нет. Более того, если явно определить функцию как inline в одной единице трансляции и вызвать ее из другой, то при компиляции появится ошибка unresolved external ( undefined reference, или другая, в зависимости от компилятора ).
1
TierX
20 / 20 / 0
Регистрация: 28.02.2014
Сообщений: 138
22.07.2014, 12:06  [ТС] #8
Цитата Сообщение от Tulosba Посмотреть сообщение
Не будет ошибок множественного определения. Насчет никаких это уже более широкий вопрос
просто я вчера пытался выяснить ответ на данную тему( использование описаня и реализации класа в 1 хедере). Привели только 1 аргумент ошибки - про множественное определение. А раз его можно избежать значит это не аргумент уже.
0
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
22.07.2014, 12:20 #9
Цитата Сообщение от TierX Посмотреть сообщение
Если я пишу определение функции в сpp файле, функция будет inline без явного указания на это?
Как компилятор пожелает. И даже если вы явно укажете inline не факт что она будет действительно встроена. В то же время, если не указан inline она вполне может оказаться встроенной.
0
Kastaneda
Форумчанин
Эксперт С++
4655 / 2863 / 228
Регистрация: 12.12.2009
Сообщений: 7,276
Записей в блоге: 2
Завершенные тесты: 1
22.07.2014, 12:30 #10
В каждом оптимизирующем компиляторе есть свои алгоритмы инлайнинга. Геттеры/сеттеры чаще всего инлайнятся в первую очередь даже без указаний компилятору. Остальные ф-ции могут быть выбраны для инлайнинга по размеру, по кол-ву внутренних вызовов и т.д.
0
Tulosba
:)
Эксперт С++
4396 / 3232 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
22.07.2014, 12:31 #11
Цитата Сообщение от ForEveR Посмотреть сообщение
Как компилятор пожелает.
Тут, кстати, сразу вспоминаются майкрософтовские __forceinline.
1
TierX
20 / 20 / 0
Регистрация: 28.02.2014
Сообщений: 138
22.07.2014, 12:35  [ТС] #12
Цитата Сообщение от Toshkarik Посмотреть сообщение
Нет. Более того, если явно определить функцию как inline в одной единице трансляции и вызвать ее из другой, то при компиляции появится ошибка unresolved external ( undefined reference, или другая, в зависимости от компилятора ).
действительно я попробывал определить функции класа как inline в отедльном cpp и испольщуя хедер с описанием класа в другом спп запустить функцию. Компилятор заматюкался.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// хедер
#ifndef __I__
#define __I__
#include<iostream>
class X{
public:
    X();
    int x;
    void show();
};
#endif
___
// срр определения функций.
#include "I.h"
inline X::X(){x=6;}
inline void X::show(){std::cout<<x;}
___
// main
#include "i.h"
 
int main()
{
X x1;
x1.show();
}
___

Следовательно явно inline в срр файле обьявлять нельзя. Чото много както мутной жижи с этим всем.
Значит явное указание inline приминимо только для хедеров. А выносное определение функций класса в срр отдаеться на автоматическое решение компилятора.
В тоже время не факт что явно обьявленые фун. в хедере будут inline 100%. Следовательно inline служит только для того чтобы функции можно было определять в хедере (нетолько функции члены класа) без дальнейшиз ошибок множественого определения их же.
Покачто так все выглядит

PS Хедер есть единицей трансляции?
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
22.07.2014, 12:42 #13
Из стандарта:
An inline function shall be defined in every translation unit in which it is used and shall have exactly the same definition in every case.
Цитата Сообщение от TierX Посмотреть сообщение
PS Хедер есть единицей трансляции?
В общих чертах - единицей трансляции является .cpp файл.
Заголовки являются частью каждой единицы трансляции, в которую они включены.
1
TierX
20 / 20 / 0
Регистрация: 28.02.2014
Сообщений: 138
22.07.2014, 12:56  [ТС] #14
Значит хедер являеться общей(или конкретной) шапкой для всех cpp файлов и в тоже время являеться чатью единици трансляции для каждого.
Насколько я знаю едицица трансляции переводиться в obj и потом все связываеться в исполняемый фаил.
Если я правильно это понимаю ,то как себя в этом случае ведет себя общий хедер . Его код добавляеться к каждому срр и потом каждый срр идет в обект. Или хедер сам отдельно становиться обектом связывания. И по какомуто алгоритму связваеться с другими обектами.

Это все к тому. Следует ли вобще разделять определение функций в пару h/cpp
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
22.07.2014, 13:02 #15
Перед компиляцией работет препроцессор. Если на пальцах - он "подставляет" содержимое heder.h вместо #include "heder.h", и уже после этого полученный результат отправляется компилятору. Советую почитать блог товарища Evg. Там он хорошо описал этот процесс.

http://www.cyberforum.ru/blogs/18334/blog100.html
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2014, 13:02
Привет! Вот еще темы с ответами:

Нужно ли всегда использовать using при работе с файлами - C#
using (FileStream fs = new FileStream(path,FileMode.Open,FileAccess.ReadWrite)) { using (StreamReader fr = new StreamReader(fs)) ...

При составлении программ нужно всегда сначала математическую модель составлять? - Pascal
Если сразу пытаться писать и исправлять ошибки по ходу дела, то это плохо?

Как указывать аргументы при вызове одного метода из другого? - C#
Добрый день! Прошу прощения за совсем примитивизм: public void panel1_paint(Object sender, PaintEventArgs e) { ...

Server 2012 Как сделать так, чтобы при подключении по RDP не указывать порт? - Windows Server
Добрый день поменял порт через регистр с 3389 на 3811 , теперь надо при подключении порт указывать а можно что то сделать на сервере...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
22.07.2014, 13:02
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru