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

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

22.07.2014, 11:21. Показов 3996. Ответов 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
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
25.07.2014, 20:07
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от DrOffset Посмотреть сообщение
С -О3 вывод эквивалентен выводу clang. Однако у нас -О3 забанен на административном уровне. Вследствие более глобальных и фатальных прецедентов с генерацией кода.
а можно поподробнее? Я просто ничего серьезней лаб по прогарммированию на плюсах не писал, промышленная разработка у меня на шарпах, поэтому не сталкивался с такими проблемами
Цитата Сообщение от DrOffset Посмотреть сообщение
Это я понимаю. Просто получается, в контексте обсуждения мой пример с inline до сих пор имеет смысл, поэтому костылем и тем более древним его уже нельзя назвать А то, что у компилятора в машинный код больше возможностей - это естественно и я согласен полностью.
ну ничего, шарп обещает перебраться на С++ компилятор в ближайшие год-два, с соответствующими последствиями вроде нативности и как следствие снятии необходимости иметь .Net framework на конечной машине. Так что еще поборемся

Добавлено через 2 минуты
DrOffset, кстати насчет JIT, мне нравится его вариация в MS Singularity - компиляция при установке программы. Тут совмещается качество AOH-компиляции с объемом информации JIT-компилятора о целевой машине. То есть компилируется со всеми оптимизациями в машкод, но учитывается процессор (а значит, может эффективно использоваться SIMD и прочие плюшки), объем памяти и т.д. и т.п.
1
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
25.07.2014, 20:19
Цитата Сообщение от Psilon Посмотреть сообщение
а можно поподробнее?
Сложно будет это рассказать не нарушив NDA, т.к. конкретные примеры потребуют показать код.
Если в общем, то при высоких уровнях оптимизации, есть вероятность, что оптимизатор сломает код. Эта вероятность присутствует и на более низких уровнях, но она гораздо реже проявляется. Вот мой предыдущий рассказ про вычислительный модуль как раз из этой серии. Там была всего лишь -O2 и она ломала код. И 2 года все думали что это нормально, потому что автор алгоритма это обосновал допустимыми погрешностями. Все было хорошо, пока на определенных входных данных мы не начали получать просто бешеные, совершенно нереальные числа. Вот тогда-то уже я стал искать причины и выяснилось, что дело в оптимизации, и перевод с -O2 на -О1 решил проблему. А вообще, хорошей практикой для таких задач является индивидуальный набор параметров оптимизации. К чему в конце концов мы и перешли.

Цитата Сообщение от Psilon Посмотреть сообщение
Так что еще поборемся
Не вижу смысла в такой борьбе, у каждого инструмента своя задача. Если для инструмента нет задачи, то его просто не используют
0
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
25.07.2014, 20:24
Цитата Сообщение от DrOffset Посмотреть сообщение
Не вижу смысла в такой борьбе, у каждого инструмента своя задача. Если для инструмента нет задачи, то его просто не используют
хорошо, когда есть более 1 способа решить задачу Каждый выбирает тот, который ему удобнее.

Цитата Сообщение от DrOffset Посмотреть сообщение
Сложно будет это рассказать не нарушив NDA, т.к. конкретные примеры потребуют показать код.
Если в общем, то при высоких уровнях оптимизации, есть вероятность, что оптимизатор сломает код. Эта вероятность присутствует и на более низких уровнях, но она гораздо реже проявляется. Вот мой предыдущий рассказ про вычислительный модуль как раз из этой серии. Там была всего лишь -O2 и она ломала код. И 2 года все думали что это нормально, потому что автор алгоритма это обосновал допустимыми погрешностями. Все было хорошо, пока на определенных входных данных мы не начали получать просто бешеные, совершенно нереальные числа. Вот тогда-то уже я стал искать причины и выяснилось, что дело в оптимизации, и перевод с -O2 на -О1 решил проблему.
недавно натыкался на статейку на похожую тему, авось будет интересно
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
25.07.2014, 20:28
Цитата Сообщение от Psilon Посмотреть сообщение
недавно натыкался на статейку на похожую тему
Не, ну тут UB. Это про другое. У нас UB не было. Более новые компиляторы (проверяли на трех платформах) работали нормально и с -О2 и даже с -О3. Да и ручной анализ кода не выявил никаких ошибок (а статический тем более). Но проблема в сертификации, нам нельзя использовать не сертифицированный компилятор, как следствие выкручиваться приходится на том, что имеем.
1
Master of Orion
Эксперт .NET
 Аватар для Psilon
6101 / 4957 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
25.07.2014, 20:32
DrOffset, я же и говорю про "похожую", а не "Такую же" Разница-то в любом случае есть: компилятор оптимизирует UB, не нарушая логики алгоритма (хотя и неочевидно для программиста), у вас же оптимизация как раз-таки нарушала логику. Я бы не поверил, если бы не знал, как та же оптимизация переупорядочиванием инструкций в многопотоке может повлиять (если неграмотно расставить барьеры).
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
25.07.2014, 20:39
Цитата Сообщение от Psilon Посмотреть сообщение
я же и говорю про "похожую", а не "Такую же"
Ну да. Я как-то это пропустил

Цитата Сообщение от Psilon Посмотреть сообщение
Я бы не поверил, если бы не знал, как та же оптимизация переупорядочиванием инструкций в многопотоке может повлиять (если неграмотно расставить барьеры).
Да тоже сегодня такой косяк отлаживали, что далеко не каждый С++ник сталкивался.
Вообще все эти проблемы в основном очень долго живут на legacy, которому по 5-10 и более лет. Если сразу одна команда и новый проект, то по крайней мере первые несколько лет можно вообще не столкнуться с подобным ни разу. Отсюда удивление многих, даже опытных программистов.
0
25.07.2014, 22:50

Не по теме:

Цитата Сообщение от Psilon Посмотреть сообщение
кстати насчет JIT, мне нравится его вариация в MS Singularity - компиляция при установке программы.
Круто, с C# не работал, не знал о такой фишке. Действительно здорово придумали.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.07.2014, 22:50
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
47
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru