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

Inline функции в классах

11.06.2017, 16:00. Показов 4532. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Недавно прочитал, что все функции которые определяются в классе по дефолту inline. Что меня настораживает так как мой ̶б̶ы̶д̶л̶о̶к̶о̶д̶е̶р̶с̶к̶и̶й̶ стиль программирования подразумевает определения функций именно в классах. И вот не хотелось бы чтобы все мои функции были бы встраиваемые. Короче не могли бы вы немного посветить в эту тему ̶г̶л̶у̶б̶ж̶е̶ .
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.06.2017, 16:00
Ответы с готовыми решениями:

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

Inline-функции в шаблонных классах
Стоит ли применять inline-функции для описания методов шаблонного класса?

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

24
1498 / 1213 / 821
Регистрация: 29.02.2016
Сообщений: 3,631
11.06.2017, 16:16
Inline функции
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
11.06.2017, 16:20
Цитата Сообщение от TheLimboUser Посмотреть сообщение
И вот не хотелось бы чтобы все мои функции были бы встраиваемые.
Не по дефолту inline, а по желанию данного конкретного компилятора. Если ему сильно понадобится, и данная функция нигде вне класса не используется, компилятор может её встроить. Если прописать inline, то компилятор наоборот, может решиться данную функцию встроить, а может и не решиться. Ну и для каких-то компиляторов типа микрософтовского добавляют ещё степени необходимости встраивания (не по стандарту С++) - https://msdn.microsoft.com/ru-... hbe6y.aspx .

В общем, особой важности в пометке inline нет.
1
1 / 1 / 0
Регистрация: 17.08.2016
Сообщений: 37
11.06.2017, 18:15  [ТС]
TRam_, то есть, проблем с размером програмы быть не должно?
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
11.06.2017, 18:47
Шаблонные классы сожрут в разы больше размера программы, чем какое-то встраивание.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
11.06.2017, 18:47
Цитата Сообщение от TheLimboUser Посмотреть сообщение
TRam_, то есть, проблем с размером програмы быть не должно?
Должно. Вот как включите статическую линковку, да вставите в программу чего ни будь из STL, так и будут проблемы с раздуванием "Hello World!" до целого мегабайта. И я не иронизирую, сейчас специально программу из одного cout<<1234 в Mingw скомпилировал, 966 кило как корова языком слизнула (Студия вроде бы жрала сто с чем-то килобайт). А не сделаете статическую линковку - программа при переносе на другой компьютер будет жаловаться "dll-ки дай... Вон те, размером с мегабайт". И STL это еще цветочки, сколько за собой таскает Qt это вообще сказка. Стра-а-ашная.

Если же говорить конкретно о инлайнах, то есть ключики компилятора говорящие ему делать побыстрей или покомпактней. От них пользы скорее всего будет куда больше, чем от расстановки inline.
0
зомбяк
 Аватар для TRam_
1585 / 1219 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
11.06.2017, 19:06
Цитата Сообщение от Renji Посмотреть сообщение
одного cout<<1234 в Mingw скомпилировал, 966 кило как корова языком слизнула
Компилируем Qt 5.8 статически (с опцией -debug), делаем приложение в виде абсолютно пустого окна, его статически компилируем под MinGW, и вуаля - у нас есть абсолютно пустое окно, в котором ничего нет кроме кнопки "закрыть", но весит exe-шное приложение, содержащее это окно, 404 054 521 байт (385 мегабайт)
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
11.06.2017, 19:07
У меня подозрение, что разработчикам Си++ не хотелось вводить в язык новое ключевое слово, вот они и переиспользовали inline. Смысл ключевого слова inline в Си++ вовсе не в inline-подстановке компилятором, а в возможности реализовывать multiple definition или, говоря по простому, помещать тело функции в header'ы (см. ссылку из поста #2). Конечная цель всех этих действий - это выполнять inline. Но компилятор выполняет подстановку независимо от наличия ключевого слова inline. А ключевое слово inline говорит компилятору о том, что после inline-подстановки тело функции можно в код не помещать. Так же тело функции в код можно не помещать, если функция не используется. inline-функции в языке Си++ по смыслу являются аналогами макросов, но более удобные и безопасные в работе
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
11.06.2017, 19:20
Цитата Сообщение от Evg Посмотреть сообщение
Смысл ключевого слова inline в Си++ вовсе не в inline-подстановке компилятором, а в возможности реализовывать multiple definition или, говоря по простому, помещать тело функции в header'ы (см. ссылку из поста #2).
Кто-то мешал делать это без inline? Ну, в смысле считаем что все функции по умолчанию inline и баста.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
11.06.2017, 19:36
Естественно. Попробуй помести функцию в хидер без inline'а и подцепи хидер из двух файлов *.cpp
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
11.06.2017, 19:45
Цитата Сообщение от Evg Посмотреть сообщение
Естественно. Попробуй помести функцию в хидер без inline'а и подцепи хидер из двух файлов *.cpp
Что компилятор выругается это понятно. Непонятно какая в этом насущная необходимость.
Впрочем, уже понял - если мы поместим одну и ту же функцию в два разных cpp файла, то из-за раздельной компиляции она безальтернативно скомпилируется два раза. Ведь компилируя 2.cpp, компилятор не знает что он там насобирал в 1.cpp. А если мы подпишем к этой функции inline, то можем гордо заявить "это не баг, это фича!".
0
53 / 31 / 13
Регистрация: 21.05.2017
Сообщений: 109
11.06.2017, 19:55
Цитата Сообщение от TRam_ Посмотреть сообщение
Не по дефолту inline, а по желанию данного конкретного компилятора.
Встраиваемая (inline) функция != функция будет встроена. Компилятор может встроить её, а может и нет, но она в любом случае будет встраиваемой. inline влияет на правила построения конечного кода компилятором.
Цитата Сообщение от TRam_ Посмотреть сообщение
В общем, особой важности в пометке inline нет.
Живи в своём мире, в нашем оно еще как важно.
Цитата Сообщение от Renji Посмотреть сообщение
А если мы подпишем к этой функции inline, то можем гордо заявить "это не баг, это фича!".
Нет. Для inline-функции с внешним связыванием (коими будут функции-члены класса) стандарт требует, чтобы все вызовы этой функций происходили по одному адресу, т.е. чтобы вызывалась одна и та же функция (если не удалось встроить). Например, если в функции есть локальная статическая переменная, то поведение будет такое, какое и ожидалось - одна переменная на всех, а не в каждой единице трансляции своя переменная. В конечном счете, если функцию не встроили, то останется один её экземпляр.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
11.06.2017, 20:06
Цитата Сообщение от MasterOfAlteran Посмотреть сообщение
Например, если в функции есть локальная статическая переменная, то поведение будет такое, какое и ожидалось - одна переменная на всех, а не в каждой единице трансляции своя переменная.
И причем тут инлайн? То что переменная одна на всех, никак не мешает продублировать работающий с ней код. И то что результат &myFunction один на всех, тоже не мешает этот код продублировать. Потому что поведение от этого дублирования никак не меняется. Зато вот не продублировать код, раздельная компиляция не позволяет принципиально.
0
53 / 31 / 13
Регистрация: 21.05.2017
Сообщений: 109
11.06.2017, 20:16
Цитата Сообщение от Renji Посмотреть сообщение
Зато вот не продублировать код, раздельная компиляция не позволяет принципиально.
Для inline-функции не позволяет (нужно определение). Для вызова не inline-функций компилятору достаточно объявления, а дальше заботы линковщика. А делать все функции inline - тупенько изначально.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
11.06.2017, 20:19
Цитата Сообщение от TheLimboUser Посмотреть сообщение
И вот не хотелось бы чтобы все мои функции были бы встраиваемые.
не парьтесь.
компилятор сам разберется, что и когда ему встраивать.

киллер фича inline - разрешается multiple definition
и не более того.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
11.06.2017, 20:22
Цитата Сообщение от MasterOfAlteran Посмотреть сообщение
Для inline-функция не позволяет (нужно определение). Для вызова не inline-функций компилятору достаточно объявления, а дальше заботы линковщика.
Если у компилятора только объявление, это уже не ситуация "поместили одну функцию в два разных файла", а ситуация "поместили объявление функции в два разных файла".

Ну а как работает второй вариант - смотри шестой пост про "один cout<<1234 раздул программу на мегабайт". Линковщик просто прицепляет все что там компилятор накомпилировал, не разбираясь где нужное, где не нужное, где рыбу заворачивали. Хотя, это уже другая история.
0
53 / 31 / 13
Регистрация: 21.05.2017
Сообщений: 109
11.06.2017, 20:25
Цитата Сообщение от Renji Посмотреть сообщение
один cout<<1234 раздул программу на мегабайт
Если учесть, что там (в ostream) туча шаблонов, всякие локали, буфера и т.д., то это не удивительно. А еще нужен код для запуска всего этого добра и завершения. Когда-то и восхваляемый cl такое делал. Там это, вроде, запинали ногами кое-как, в mingw - нет.

Цитата Сообщение от Renji Посмотреть сообщение
Хотя, это уже другая история.
Именно!
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
11.06.2017, 20:43
Цитата Сообщение от MasterOfAlteran Посмотреть сообщение
Если учесть, что там (в ostream) туча шаблонов, всякие локали, буфера и т.д., то это не удивительно.
"Буфера", будучи пересобраны на коленке, не занимают и одного экрана текста. Локаль там по умолчанию "C", никаких функций преобразования текста она за собой не тянет. Единственное что может позволить библиотеке нагулять вес, это преобразователь int->text. Но опять же он никак не может весить мегабайт. Максимум - пара килобайтов.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
struct MyStreambuf:std::streambuf
{
    std::streamsize xsputn (const char* s, std::streamsize n)
    {
        for(int i=0;i<n;++i)
            overflow(s[i]);
        return n;
    }
    int overflow (int c = EOF)
    {
        printf("%c",(char)c);
        return c;
    }
};
 
int main()
{
    MyStreambuf myStreambuf;
    std::ostream stream(&myStreambuf);
    stream<<1234;
}
Цитата Сообщение от MasterOfAlteran Посмотреть сообщение
еще нужен код для запуска всего этого добра и завершения.
Три с половиной команды для инициализации консоли что ли? На мегабайт кода это ну никак не тянет.
0
53 / 31 / 13
Регистрация: 21.05.2017
Сообщений: 109
11.06.2017, 20:56
Цитата Сообщение от Renji Посмотреть сообщение
Локаль там по умолчанию "C"
Для каждого потока свой объект локали. В operator<< создаются достаточно тяжелые объекты.
Цитата Сообщение от Renji Посмотреть сообщение
Три с половиной команды для инициализации консоли что ли?
Мде... А сам cout кто будет создавать? А всё остальное? Смотри в исходники gcc. Там со старта до main очень далеко.

Цитата Сообщение от Renji Посмотреть сообщение
"Буфера", будучи пересобраны на коленке
Не будут удовлетворять нужному функционалу.

Давай когда ты напишешь свой компилятор, в котором всё будет как положено, мы соберем hello world и посмотрим сколько получится. До тех пор не вижу смысла дальше общаться на эту тему.
0
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
11.06.2017, 21:01
Цитата Сообщение от MasterOfAlteran Посмотреть сообщение
Для каждого потока свой объект локали.
И если вы явно не вызывали метод imbue, то этот "свой объект" является значением по умолчанию. То есть, "C" локалью.
Цитата Сообщение от MasterOfAlteran Посмотреть сообщение
Мде... А сам cout кто будет создавать? А всё остальное?
"Создавать" это в смысле конструкторы streambuf и ostream вызвать? Заинлайните в начало main. Только эти конструкторы как раз и будут тремя с половиной строчками инициализирующими консоль.

И да, во избежание недопонимания - cout это именно что объект ostream, которому скормили объект streambuf. Ничего сверх этого.

Добавлено через 57 секунд
Цитата Сообщение от MasterOfAlteran Посмотреть сообщение
Не будут удовлетворять нужному функционалу.
Каким конкретно местом? Вы собственно мой пример запустите, нормально он работает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.06.2017, 21:01
Помогаю со студенческими работами здесь

inline функции vs инструкции inline функций
Здравствуйте. Чтобы не писать повторно код, нужно использовать функции. Но если функции компактные, то их лучше делать inline функциями, т....

inline - функции
Стоит-ли добавлять префикс inline ко всем функциям, состоящим из 1-2 строк?

Inline функции
Друзья!Инлайн функции могу быть определены только внтури класса?Или могут быть определены вне класса?Если вне,то как?Спасибо!

Inline функции.
Здравствуйте. Скажите пожалуйста, объявление функции как inline нужно делать как в прототипе так и в определении или достаточно только в...

inline функции
Как рабоает функция inline, и какие у неё преимущества? Если она такая крутая как я понял, то зачем простые функции??


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера 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. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru