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

Объясните принцип работы части кода для вывода элементов контейнера - C++

Восстановить пароль Регистрация
 
ChadloveMary
0 / 3 / 1
Регистрация: 13.09.2015
Сообщений: 82
20.03.2016, 17:18     Объясните принцип работы части кода для вывода элементов контейнера #1
Вот, собственно говоря, сам код для вывода элементов контейнера:
C++
1
2
3
4
5
6
7
8
9
struct print {
    char sep;
    print(char s) : sep(s) { }
    inline void operator () (int x) const {
        std::cout << x << sep; 
    }
};
 
std::for_each(c.begin(), c.end, print('\t'));
Что происходит в 3 сточке? Объясните, пожалуйста, пошагово, что за чем следует?
Зачем в 4 строчке используется спецификатор inline? И что здесь тоже происходит? Перегружают (), но зачем?
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.03.2016, 17:18     Объясните принцип работы части кода для вывода элементов контейнера
Посмотрите здесь:

объясните принцип работы цикла : ? C++
Односвязные списки. Объясните принцип работы. C++
C++ Объясните, пожалуйста, принцип работы.
Ханойские башни, объясните принцип работы! C++
C++ Приложение на C++ для работы с API, подскажите/объясните принцип.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
cordfield
33 / 33 / 13
Регистрация: 04.05.2014
Сообщений: 148
20.03.2016, 18:48     Объясните принцип работы части кода для вывода элементов контейнера #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Ключевое слово "inline" можно писать перед определением любой функции. Оно говорит о том, что функция короткая и её можно оптимизировать: вместо вызова функции компилятор может подставить в нужное место программы тело функции. Полезность ключевого слова "inline" зависит от компилятора и может быть нулевой.
В данном примере print является обычным классом. В 3-й строчке находится конструктор класса. Конструктор - это специальная функция, имя которой совпадает с именем класса. Конструктор вызывается при создании объекта класса.
В классе print содержатся данные, всего 1 символ sep. Этот символ инициализируется в конструкторе. Значение символа определяется при создании объекта, например:
C++
1
print a( '\t' );
Создаёт объект класса print, в котором значение поля sep будет равно символу "табуляция".
Оператор "скобки" не "перегружается", а добавляется в класс. Нельзя сказать, что оператор перегружен, если его раньше в классе не было.
Если в класс добавить оператор "скобки", данный оператор можно будет вызывать так:
C++
1
2
print a( '\t' );
a( 33 );
В примере оператор скобки принимает один аргумент - целое число.
Функция std::for_each в качестве третьего аргумента принимает любую сущность, к которой можно приписать скобки и в качестве аргумента передать элемент контейнера. Это может быть функция или класс с оператором "скобки" или что-то другое.
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
20.03.2016, 19:51     Объясните принцип работы части кода для вывода элементов контейнера #3
Цитата Сообщение от ChadloveMary Посмотреть сообщение
Зачем в 4 строчке используется спецификатор inline?
ни зачем.

функции-члены, которые были определены в декларации класса
итак автоматически являются inline.

таким образом,
явно ещё раз это подчеркивать - избыточно.

Цитата Сообщение от cordfield Посмотреть сообщение
Оно говорит о том, что функция короткая и её можно оптимизировать
ложь.

inline - приказ программиста сделать функцию встраиваемой.
при этом не имеет значения ни её размеры,
ни возможности оптимизации.

Цитата Сообщение от cordfield Посмотреть сообщение
Полезность ключевого слова "inline" зависит от компилятора и может быть нулевой.
ложь.

смысл ключевого слово inline описан в стандарте языка.
и он не зависит ни от компиляторов,
ни от их возможностей оптимизировать.

например, inline функции можно определять прямо в хедерах.
вне зависимости от того, смог компилятор по факту оптимизировать или нет,
inline функции все равно будут обладать иммунитетом
против множественного определения.
cordfield
33 / 33 / 13
Регистрация: 04.05.2014
Сообщений: 148
20.03.2016, 20:43     Объясните принцип работы части кода для вывода элементов контейнера #4
Hoggy, я специально прямо сейчас посмотрел в двух источниках. Поведение зависит от компилятора, ключевое слово inline носит для компилятора рекомендательный характер.
На msdn написано:
The insertion (called inline expansion or inlining) occurs only if the compiler's cost/benefit analysis show it to be profitable. Inline expansion alleviates the function-call overhead at the potential cost of larger code size.
https://msdn.microsoft.com/ru-ru/lib...vs.110%29.aspx
На isocpp.org говорится:
There are several ways to designate that a function is inline, some of which involve the inline keyword, others do not. No matter how you designate a function as inline, it is a request that the compiler is allowed to ignore: the compiler might inline-expand some, all, or none of the places where you call a function designated as inline.
https://isocpp.org/wiki/faq/inline-functions
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
20.03.2016, 21:57     Объясните принцип работы части кода для вывода элементов контейнера #5
Цитата Сообщение от cordfield Посмотреть сообщение
я специально прямо сейчас посмотрел в двух источниках.
смотреть нужно стандарт.

Цитата Сообщение от cordfield Посмотреть сообщение
Поведение зависит от компилятора
поведение корректно написанного кода не зависит ни от компилятора,
ни от его способностей к оптимизации,
ни от самих оптимизаций.

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

по стандарту, компилятор не имеет права нарушать бизнес-логику
описанную программистом в коде.

если программист пометил функцию как inline,
то поведение должно соответствовать.

а теперь ещё раз вдумайтесь в эти строки:
Цитата Сообщение от hoggy Посмотреть сообщение
например, inline функции можно определять прямо в хедерах.
вне зависимости от того, смог компилятор по факту оптимизировать или нет,
inline функции все равно будут обладать иммунитетом
против множественного определения.
inline функция будет вести себя подобно inline функции вне зависимости от того,
оптимизировал ли её компилятор по факту, или нет.

именно в этом на сегодняшний день заключается смысл ключевого слова inline.

далеко ходить не нужно:
Ошибка LNK2005: многократное определение
Yandex
Объявления
20.03.2016, 21:57     Объясните принцип работы части кода для вывода элементов контейнера
Ответ Создать тему

Метки
контейнер
Опции темы

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