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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
TierX
 Аватар для TierX
19 / 19 / 0
Регистрация: 28.02.2014
Сообщений: 138
22.07.2014, 11:21     При вынесении определения всегда ли нужно указывать функцию как inline явно? #1
Бьярни пишет
Если в описании класса функция-член определена, а не только описана, то она считается подстановкой. Это значит, например, что при
трансляции функций, использующих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 явно? Или она всеже будет ею изначально как описано в начале. Слово можно както неоднозначно.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.07.2014, 11:21     При вынесении определения всегда ли нужно указывать функцию как inline явно?
Посмотрите здесь:

[C++]enum и типы данных.Как задать тип значений явно,и какой тип будет при переполнении? C++
Link error на inline функцию C++
C++ inline функции vs инструкции inline функций
Здравствуйте, подскажите пожалуйста, где я допустил ошибку(При вынесении кода в отдельную функцию, выдает ошибки) C++
Зачем нужно явно указывать тип переменной? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Psilon
Master of Orion
 Аватар для Psilon
5738 / 4686 / 619
Регистрация: 10.07.2011
Сообщений: 14,160
Записей в блоге: 5
Завершенные тесты: 4
25.07.2014, 20:07     При вынесении определения всегда ли нужно указывать функцию как inline явно? #41
Цитата Сообщение от DrOffset Посмотреть сообщение
С -О3 вывод эквивалентен выводу clang. Однако у нас -О3 забанен на административном уровне. Вследствие более глобальных и фатальных прецедентов с генерацией кода.
а можно поподробнее? Я просто ничего серьезней лаб по прогарммированию на плюсах не писал, промышленная разработка у меня на шарпах, поэтому не сталкивался с такими проблемами
Цитата Сообщение от DrOffset Посмотреть сообщение
Это я понимаю. Просто получается, в контексте обсуждения мой пример с inline до сих пор имеет смысл, поэтому костылем и тем более древним его уже нельзя назвать А то, что у компилятора в машинный код больше возможностей - это естественно и я согласен полностью.
ну ничего, шарп обещает перебраться на С++ компилятор в ближайшие год-два, с соответствующими последствиями вроде нативности и как следствие снятии необходимости иметь .Net framework на конечной машине. Так что еще поборемся

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

Цитата Сообщение от Psilon Посмотреть сообщение
Так что еще поборемся
Не вижу смысла в такой борьбе, у каждого инструмента своя задача. Если для инструмента нет задачи, то его просто не используют
Psilon
Master of Orion
 Аватар для Psilon
5738 / 4686 / 619
Регистрация: 10.07.2011
Сообщений: 14,160
Записей в блоге: 5
Завершенные тесты: 4
25.07.2014, 20:24     При вынесении определения всегда ли нужно указывать функцию как inline явно? #43
Цитата Сообщение от DrOffset Посмотреть сообщение
Не вижу смысла в такой борьбе, у каждого инструмента своя задача. Если для инструмента нет задачи, то его просто не используют
хорошо, когда есть более 1 способа решить задачу Каждый выбирает тот, который ему удобнее.

Цитата Сообщение от DrOffset Посмотреть сообщение
Сложно будет это рассказать не нарушив NDA, т.к. конкретные примеры потребуют показать код.
Если в общем, то при высоких уровнях оптимизации, есть вероятность, что оптимизатор сломает код. Эта вероятность присутствует и на более низких уровнях, но она гораздо реже проявляется. Вот мой предыдущий рассказ про вычислительный модуль как раз из этой серии. Там была всего лишь -O2 и она ломала код. И 2 года все думали что это нормально, потому что автор алгоритма это обосновал допустимыми погрешностями. Все было хорошо, пока на определенных входных данных мы не начали получать просто бешеные, совершенно нереальные числа. Вот тогда-то уже я стал искать причины и выяснилось, что дело в оптимизации, и перевод с -O2 на -О1 решил проблему.
недавно натыкался на статейку на похожую тему, авось будет интересно
DrOffset
6426 / 3800 / 880
Регистрация: 30.01.2014
Сообщений: 6,594
25.07.2014, 20:28     При вынесении определения всегда ли нужно указывать функцию как inline явно? #44
Цитата Сообщение от Psilon Посмотреть сообщение
недавно натыкался на статейку на похожую тему
Не, ну тут UB. Это про другое. У нас UB не было. Более новые компиляторы (проверяли на трех платформах) работали нормально и с -О2 и даже с -О3. Да и ручной анализ кода не выявил никаких ошибок (а статический тем более). Но проблема в сертификации, нам нельзя использовать не сертифицированный компилятор, как следствие выкручиваться приходится на том, что имеем.
Psilon
Master of Orion
 Аватар для Psilon
5738 / 4686 / 619
Регистрация: 10.07.2011
Сообщений: 14,160
Записей в блоге: 5
Завершенные тесты: 4
25.07.2014, 20:32     При вынесении определения всегда ли нужно указывать функцию как inline явно? #45
DrOffset, я же и говорю про "похожую", а не "Такую же" Разница-то в любом случае есть: компилятор оптимизирует UB, не нарушая логики алгоритма (хотя и неочевидно для программиста), у вас же оптимизация как раз-таки нарушала логику. Я бы не поверил, если бы не знал, как та же оптимизация переупорядочиванием инструкций в многопотоке может повлиять (если неграмотно расставить барьеры).
DrOffset
6426 / 3800 / 880
Регистрация: 30.01.2014
Сообщений: 6,594
25.07.2014, 20:39     При вынесении определения всегда ли нужно указывать функцию как inline явно? #46
Цитата Сообщение от Psilon Посмотреть сообщение
я же и говорю про "похожую", а не "Такую же"
Ну да. Я как-то это пропустил

Цитата Сообщение от Psilon Посмотреть сообщение
Я бы не поверил, если бы не знал, как та же оптимизация переупорядочиванием инструкций в многопотоке может повлиять (если неграмотно расставить барьеры).
Да тоже сегодня такой косяк отлаживали, что далеко не каждый С++ник сталкивался.
Вообще все эти проблемы в основном очень долго живут на legacy, которому по 5-10 и более лет. Если сразу одна команда и новый проект, то по крайней мере первые несколько лет можно вообще не столкнуться с подобным ни разу. Отсюда удивление многих, даже опытных программистов.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.07.2014, 22:50     При вынесении определения всегда ли нужно указывать функцию как inline явно?
Еще ссылки по теме:

C++ Почему в scanf нужно указывать именно адреса переменных?
C++ Inline функции - на сколько должна быть маленькая функция, чтоб она подошла под inline?
Написать функцию, принимающую параметры, заданные явно и пропущенные C++

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

Или воспользуйтесь поиском по форуму:
Kastaneda
25.07.2014, 22:50     При вынесении определения всегда ли нужно указывать функцию как inline явно?
  #47

Не по теме:

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

Yandex
Объявления
25.07.2014, 22:50     При вынесении определения всегда ли нужно указывать функцию как inline явно?
Ответ Создать тему
Опции темы

Текущее время: 12:01. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru