Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
 Аватар для TierX
21 / 21 / 0
Регистрация: 28.02.2014
Сообщений: 138

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

22.07.2014, 11:21. Показов 4104. Ответов 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.07.2014, 11:21
Ответы с готовыми решениями:

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

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

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

46
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
22.07.2014, 11:26
Лучший ответ Сообщение было отмечено TierX как решение

Решение

TierX, inline это только совет компилятору, однако в С++ правило, что функции определенные в классе являются inline по умолчанию позволяет определять функции в хедерах, без получения ошибок о множественном определении функции.
Так же указание inline при определении вне класса в хедер файле позволяет аналогичную вещь.
2
 Аватар для TierX
21 / 21 / 0
Регистрация: 28.02.2014
Сообщений: 138
22.07.2014, 11:38  [ТС]
Да но я не обэтом спрашивал) Если я пишу определение функции в сpp файле, функция будет inline без явного указания на это?
0
zzzZZZ...
 Аватар для dzrkot
527 / 358 / 94
Регистрация: 11.09.2013
Сообщений: 2,041
22.07.2014, 11:44
Цитата Сообщение от TierX Посмотреть сообщение
Да но я не обэтом спрашивал) Если я пишу определение функции в сpp файле, функция будет inline без явного указания на это?
если часто вызывается то вроде как да, компилятор сам решает
0
 Аватар для TierX
21 / 21 / 0
Регистрация: 28.02.2014
Сообщений: 138
22.07.2014, 11:45  [ТС]
Хм значит если в хедере написать описание класа с вынесением определения его функций как inline в этом же хедере, то никаких ошибок при исползовании такого хедера не будет?
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
22.07.2014, 12:00
Цитата Сообщение от TierX Посмотреть сообщение
то никаких ошибок при исползовании такого хедера не будет?
Не будет ошибок множественного определения. Насчет никаких это уже более широкий вопрос
0
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
22.07.2014, 12:02
Лучший ответ Сообщение было отмечено TierX как решение

Решение

Цитата Сообщение от TierX Посмотреть сообщение
Если я пишу определение функции в сpp файле, функция будет inline без явного указания на это?
Нет. Более того, если явно определить функцию как inline в одной единице трансляции и вызвать ее из другой, то при компиляции появится ошибка unresolved external ( undefined reference, или другая, в зависимости от компилятора ).
1
 Аватар для TierX
21 / 21 / 0
Регистрация: 28.02.2014
Сообщений: 138
22.07.2014, 12:06  [ТС]
Цитата Сообщение от Tulosba Посмотреть сообщение
Не будет ошибок множественного определения. Насчет никаких это уже более широкий вопрос
просто я вчера пытался выяснить ответ на данную тему( использование описаня и реализации класа в 1 хедере). Привели только 1 аргумент ошибки - про множественное определение. А раз его можно избежать значит это не аргумент уже.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
22.07.2014, 12:20
Цитата Сообщение от TierX Посмотреть сообщение
Если я пишу определение функции в сpp файле, функция будет inline без явного указания на это?
Как компилятор пожелает. И даже если вы явно укажете inline не факт что она будет действительно встроена. В то же время, если не указан inline она вполне может оказаться встроенной.
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
22.07.2014, 12:30
В каждом оптимизирующем компиляторе есть свои алгоритмы инлайнинга. Геттеры/сеттеры чаще всего инлайнятся в первую очередь даже без указаний компилятору. Остальные ф-ции могут быть выбраны для инлайнинга по размеру, по кол-ву внутренних вызовов и т.д.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
22.07.2014, 12:31
Цитата Сообщение от ForEveR Посмотреть сообщение
Как компилятор пожелает.
Тут, кстати, сразу вспоминаются майкрософтовские __forceinline.
1
 Аватар для TierX
21 / 21 / 0
Регистрация: 28.02.2014
Сообщений: 138
22.07.2014, 12:35  [ТС]
Цитата Сообщение от 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
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
22.07.2014, 12:42
Из стандарта:
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
21 / 21 / 0
Регистрация: 28.02.2014
Сообщений: 138
22.07.2014, 12:56  [ТС]
Значит хедер являеться общей(или конкретной) шапкой для всех cpp файлов и в тоже время являеться чатью единици трансляции для каждого.
Насколько я знаю едицица трансляции переводиться в obj и потом все связываеться в исполняемый фаил.
Если я правильно это понимаю ,то как себя в этом случае ведет себя общий хедер . Его код добавляеться к каждому срр и потом каждый срр идет в обект. Или хедер сам отдельно становиться обектом связывания. И по какомуто алгоритму связваеться с другими обектами.

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

https://www.cyberforum.ru/blogs/18334/blog100.html
1
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
22.07.2014, 13:02
TierX, Следует. В нормальных программах следует. А для тестов как-то пофиг, я предпочитаю просто писать в .cpp, не разбивая на .h/.cpp, ибо так проще, быстрее и для тестов сойдет.
1
22.07.2014, 13:16

Не по теме:

Цитата Сообщение от ForEveR Посмотреть сообщение
А для тестов как-то пофиг, я предпочитаю просто писать в .cpp, не разбивая на .h/.cpp, ибо так проще, быстрее и для тестов сойдет.
А ещё не нужно искать (и использовать) всякие многофайловые онлайн компиляторы :)

0
 Аватар для TierX
21 / 21 / 0
Регистрация: 28.02.2014
Сообщений: 138
22.07.2014, 13:29  [ТС]
Вот и я о томже только наоборт я люблю в .h все пихать. Ибо 10 файлоов куда лучше 20. И хотелось бы чтобы так можно было делать постоянно. НО без какихто последствий увелечения времени компиляции сборки итд. Вот именно эти последствия я и пытаюсь найти .И понять есть ли они по настоящему или просто как и везеде "так принято"

Но вы говорите следует. А почему не ясно) Толи потому ,что такой подход снижает реальные показатели такие как время компляции сборки и запуска. Толи потому что "так принято".

Ну едиственая очевидная для меня причина это типо если я делаю какуето либу и реализацию нужно спрятать чтобы скрыть мой уникальный труд от злых посягателей.

Я не горю желанием мучатьсяв процесе разработки с Х 2 кол.файлов программы просто потомучто "так принято". Гораздро проще просто писать так чтобы потом можно было за 2 минуты раскидать реализацию по срр от хедеров(если уж "так принято").
Но опять же если по этой причине я буду в 4 раза дольше ждать пока моя программа перекомпилируеться и запуститься то тогда это аргумент в "следует"

Добавлено через 8 минут
Вон Бьярни тоже говорит что если у вас больше 10 хедеров то вы маньяк мазохист
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
22.07.2014, 13:38
TierX, It depends. Хедер-онли библиотеки тоже существуют, почему нет. Однако естественно скорость компиляции изменяется и быстрее компилируются не хедер-онли. Все просто - вы вносите изменение в хедер, который включен еще в 10-к хедеров, которые включены еще в 10-к хедеров и т.д. - все куда включено перекомпилируется. Вы изменяете .cpp файл - перекомпилируются только те файлы/либы, которые зависят от этой либы.
1
 Аватар для TierX
21 / 21 / 0
Регистрация: 28.02.2014
Сообщений: 138
22.07.2014, 13:49  [ТС]
ForEveR, Короче отличным выходом послужило бы средство которое бы показывало время за котрое проект был перекомпелирован и пересобран и еще что там (вобщем все все процедуры). Полюому есть каке-то функции или настройка которая гдето в IDE выводила это время. Это былобы очень ок.
Вот моя VS 12 в выводе показует все кроме времени)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.07.2014, 13:49
Помогаю со студенческими работами здесь

Каковы три случая, когда надо явно указывать приведение примитивных типов в Java?
Моя наставница по Java после проверки того, насколько хорошо я усвоил материал, сказала, что у меня проблемы с пониманием приведением...

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

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

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

Ошибки при вынесении operator== за структуру
В одной из соседних тем woldemas посоветовал написать оператор == за структурой для сравнения std::vector, привязанных к этой структуре, но...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru