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

Что такое side-effects - C++

Восстановить пароль Регистрация
 
 
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2139 / 972 / 223
Регистрация: 30.11.2013
Сообщений: 3,241
30.12.2015, 18:09     Что такое side-effects #1
Добрый день,

что такое side-effects и с чем их едят? В каких коварных моментах языка стоит помнить про данный термин. Когда незнания его может привести к последствиям.

По анализу вопросу понял, что это: если функция не умеет внешних связей и работатет по принципу:
вы мне запрос - я вам ответ.
То такая функция без side-effect'ов.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.12.2015, 18:09     Что такое side-effects
Посмотрите здесь:

Что такое ООП. C++
что такое цикл while и Do-while C++
что такое перезагрузка C++
C++ что такое extern?
C++ Найти такое k, что (k-1)! < A < k!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ct0r
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
30.12.2015, 18:17     Что такое side-effects #2
Так вот же ж:
https://en.wikipedia.org/wiki/Side_e...ter_science%29
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2139 / 972 / 223
Регистрация: 30.11.2013
Сообщений: 3,241
30.12.2015, 18:25  [ТС]     Что такое side-effects #3
Я прочитал достаточно информации на википедии, stackoverflow и других ресурсах, чтобы нормально так запутаться. Везде вода, зачем не понятно, как использовать знания полученые прочитав ту или инную статью - не понятно. Что это вещь спасёт мир всём понятно, но никто не говорит кейсы дальше чем
C++
1
2
3
4
5
int f(int& a)
{
a++;
return a - 7;
}
ct0r
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
30.12.2015, 18:35     Что такое side-effects #4
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Я прочитал достаточно информации на википедии, stackoverflow и других ресурсах, чтобы нормально так запутаться. Везде вода, зачем не понятно, как использовать знания полученые прочитав ту или инную статью - не понятно.
Не знаю, что тебе там непонятно. На википедии все доступно написано и объяснено. Разве что многопоточную среду не упоминают. Читай внимательно, а не бегло.
DrOffset
6460 / 3834 / 885
Регистрация: 30.01.2014
Сообщений: 6,629
30.12.2015, 19:04     Что такое side-effects #5
Сообщение было отмечено автором темы, экспертом или модератором как ответ
rikimaru2013, хочешь более нетривиальных примеров?

Например, код:
C++
1
if(a && b && c) {}
Допустим нам известна ленивая семантика оператора &&. Есть ли тут сайдэффекты?
Ответ: смотря что ими считать. Например, ленивость - можно считать сайдэффектом оператора &&.
Если наша логика каким-либо образом завязана на порядок вычислений, например так:
C++
1
if(a++ && b++ && c++) {}
то, если a++ - true, то `b` инкрементируется, в противном случае - нет. Если b++ - true, то `с` тоже инкрементируется, в противном случае нет. Если все выражение - true, то входим в блок if. Совместно с проверкой осуществляются некоторые действия, которые зависят от ленивости оператора && и каким-то образом в итоге влияют на логику программы.
А теперь представим, что у нас появилась перегрузка оператора && для некоторых классов, а операторы ++ примененные к `a`,`b`, `c` возвращает объекты этих классов.
Появляются другие сайдэффекты:
1) Пропадает ленивость.
2) Порядок вычисления аргументов теперь не определен.

Резюмируя: никогда не полагайся на ленивость оператора && (и подобных с тем же свойством), если существует ненулевая вероятность, что в данном контексте он может быть перегружен. Ленивостью обладает только встроенная версия, а пользовательская перегрузка обладает только свойствами обычной функции.
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
30.12.2015, 23:28     Что такое side-effects #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
что такое side-effects и с чем их едят?
побочные эффекты.

любая ботва, которая может неявно (скрытно от программиста) влиять на среду.

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

в чем тут подвох?

логика второй функции зависит от логики первой.
нельзя поправить первую функцию без учета второй,
есть риск, что она поломается.


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

в релизе компилятор оптимизировал конструкторы копии
забив на все побочные эффекты (copy elision)
а потом приперся на форум,
и выложил километр своего говнокода со словами:
"у меня тут чота не работает"

третий пример:
по стандарту, циклы без побочных эффектов
(без изменения внешнего состояния) - UB

почитайте про то, как компилятор сумел доказать теорему Ферма:
http://habrahabr.ru/post/229963/

там есть ссылки на оригинальный текст.
а ниже - перевод на русском.
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2139 / 972 / 223
Регистрация: 30.11.2013
Сообщений: 3,241
30.12.2015, 23:51  [ТС]     Что такое side-effects #7
Цитата Сообщение от hoggy Посмотреть сообщение
какой то идиот вкрячил в конструктор копии сайд эффект
если вы про мою вчерашнюю тему, где я писал о "возможной магии в copy constr" - намёк понял )))
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
30.12.2015, 23:57     Что такое side-effects #8
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
если вы про мою вчерашнюю тему, где я писал о "возможной магии в copy constr" - намяк понял )))
нет никаких намеков.
вашу тему вероятно я даже не видел,
поскольку не знаю о чем это вы сейчас.

это просто пример.
и суть простая - побочные эффекты - этакие "нежданчики".
они как бы есть, но как бы прозрачно для программиста.
если на них заложилась какая то важная логика - это путь тернистый,
странных ошибок.

одна из причин, из-за которой считается, что "глобальные переменные - зло",
связанна с тем, что манипуляции с глобальными переменными - суть побочные эффекты.
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2139 / 972 / 223
Регистрация: 30.11.2013
Сообщений: 3,241
31.12.2015, 01:15  [ТС]     Что такое side-effects #9
hoggy, вызов другого метода в методе является side-effect'ом? Как бы метод зависит от результатов работы др метода (и/или вызов статического метода синглтона)
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
31.12.2015, 01:18     Что такое side-effects #10
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
вызов другого метода в методе является side-effect'ом?
да, если компилятор не имеет возможности узнать, что внутри этого метода.

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

если не доступен, то он должен сделать вызов,
не зная к чему это приведет.
это "не знание" и есть "побочный эффект" с точки зрения компилятора.
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2139 / 972 / 223
Регистрация: 30.11.2013
Сообщений: 3,241
31.12.2015, 01:34  [ТС]     Что такое side-effects #11
hoggy, тогда как компилятор не смог увидить перегрузки для if(a++ && b++ && c++) {}
и соптимизировать код. На этапе компиляции - все поведения определены
ct0r
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
31.12.2015, 01:39     Что такое side-effects #12
hoggy, ты тут ошибаешься. Нет такого понятия как "побочные эффекты с точки зрения компилятора". Даже если отвлечься от высокоуровневого термина "побочный эффект", стандарт четко говорит, что это такое:
Reading an object designated by a volatile glvalue (3.10), modifying an object, calling a library I/O
function, or calling a function that does any of those operations are all side effects, which are changes in the
state of the execution environment.
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
31.12.2015, 01:44     Что такое side-effects #13
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
тогда как компилятор не смог увидить перегрузки для if(a++ && b++ && c++) {}
и соптимизировать код. На этапе компиляции - все поведения определены
вопрос не понятен.

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

в данном случае имеет место быть ленивым вычислениям:
Код
если a ---> true тогда вычислить следующее выражение
++a
если у вас там операторы инкремента перегружены - ну значит там своя логика.
вопрос лишь в том - доступна ли она компилятору.
и включены ли режимы оптимизации его работы.

Добавлено через 4 минуты
Цитата Сообщение от ct0r Посмотреть сообщение
ты тут ошибаешься. Нет такого понятия как "побочные эффекты с точки зрения компилятора".
вы просто вдумайтесь: "понятие с точки зрения компилятора".
как бе понятно, что это именно что понятие,
а не формальная терминология.

и это понятие существует для того,
что бы можно было понять сабж.

Цитата Сообщение от ct0r Посмотреть сообщение
Reading an object designated by a volatile glvalue (3.10), modifying an object, calling a library I/O
function, or calling a function that does any of those operations are all side effects, which are changes in the
state of the execution environment.
здесь нет определения термина "побочный эффект".
ct0r
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
31.12.2015, 02:08     Что такое side-effects #14
Цитата Сообщение от hoggy Посмотреть сообщение
вы просто вдумайтесь: "понятие с точки зрения компилятора".
как бе понятно, что это именно что понятие,
а не формальная терминология.
и это понятие существует для того,
что бы можно было понять сабж.
Я безусловно понял, что ты имеешь в виду. Но это, опять же, как ты сам сказал, твое личное понятие. Которое не принято ни в стандарте, ни вообще в computer science.

Цитата Сообщение от hoggy Посмотреть сообщение
здесь нет определения термина "побочный эффект".
side effects - это как раз оно, если че И например тут http://en.cppreference.com/w/cpp/language/eval_order со мной согласны.

Добавлено через 10 минут
Для тех, кто еще не понял, что такое функция без побочных эффектов.
Грубо(!) говоря, эта функция,
1) возвращаемое значение которой зависит только от параметров, в нее переданных
2) если все места, где она вызывается, заменить возвращаемым значением, поведение программы не изменится.

Зачем такие функции нужны:
1) их легче понимать
2) их легче сопровождать
3) их легче отлаживать
4) их легче тестировать
5) их легче переиспользовать
6) их легче верифицировать.
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
31.12.2015, 02:59     Что такое side-effects #15
Цитата Сообщение от ct0r Посмотреть сообщение
side effects - это как раз оно, если че
там говориццо что является побочным эффектом,
но не говориццо, что такое "побочный эффект"

поэтому, с точки зрения терминологии (а не понятий),
не понятно, что именно оно - "оно".

и что с того? ссылку на которую вы дали, это понятие не раскрывает.

а если рассуждать с точки зрения "понятия" которое я дал в #10,
то уточнениям "точкам следования" с++11 оно никак не противоречит.
ct0r
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
31.12.2015, 05:10     Что такое side-effects #16
Цитата Сообщение от hoggy Посмотреть сообщение
там говориццо что является побочным эффектом,
но не говориццо, что такое "побочный эффект"
Да как не говорится? Вот: side effects, which are changes in the state of the execution environment. Все, что после which, относится именно к определению side effects, а не ко всему предыдущему.

Цитата Сообщение от hoggy Посмотреть сообщение
и рули, ссылку на которую вы дали, это понятие не раскрывает.
Ну кому как.

Цитата Сообщение от hoggy Посмотреть сообщение
то уточнениям "точкам следования" с++11 оно никак не противоречит.
Из твоего понятия следует, что вызов абсолютно любой незаинлайненной функции - это побочный эффект. Но это не так, потому что побочный эффект при вызове функции получается - только если эта вызываемая функция с побочным эффектом.
К тому же в С++11 уже нет такой штуки как точки следования. Давай не пользоваться старой терминологией.
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
31.12.2015, 14:18     Что такое side-effects #17
Цитата Сообщение от ct0r Посмотреть сообщение
Но это бред, потому что побочный эффект при вызове функции получается - только если эта вызываемая функция с побочным эффектом.
объясните это компилятору, который не телепат, и не знает, что там внутри.

Цитата Сообщение от ct0r Посмотреть сообщение
К тому же в С++11 уже нет такой штуки как точки следования. Давай не пользоваться старой терминологией.
те же яйца, только сбоку и с уточнениями.

Цитата Сообщение от ct0r Посмотреть сообщение
Все, что после which, относится именно к определению side effects, а не ко всему предыдущему.
... are all side effects, which..
"..сайд эффейты, которые..."

там нет определения, что есть "сайт эффект".
ct0r
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
31.12.2015, 14:33     Что такое side-effects #18
Цитата Сообщение от hoggy Посмотреть сообщение
объясните это компилятору, который не телепат, и не знает, что там внутри.
Мы тут про побочные эффекты или про компилятор? Они не связаны друг с другом никак. Поэтому мне абсолютно всё равно, что и как там с компилятором, поскольку он никакого влияния на определение побочного эффекта не оказывает.

Цитата Сообщение от hoggy Посмотреть сообщение
"..сайд эффейты, которые..."
там нет определения, что есть "сайт эффект".
Ты всегда английский так переводишь - первые 3 слова? Давай продолжим: побочные эффекты, которые - (есть) (представляют собой) изменения в состоянии среды исполнения. Такое ощущение, как будто ты на экзамене и выкручиваешься, чтобы тебе пару не влепили.
hoggy
5230 / 2121 / 404
Регистрация: 15.11.2014
Сообщений: 4,812
Завершенные тесты: 1
31.12.2015, 14:46     Что такое side-effects #19
Цитата Сообщение от ct0r Посмотреть сообщение
Мы тут про побочные эффекты или про компилятор?
текущее сообщение - ответ на ваше сообщение,
которое ответ на моё предыдущее сообщение,
ключевое слово которого было:
Цитата Сообщение от hoggy Посмотреть сообщение
это "не знание" и есть "побочный эффект" с точки зрения компилятора.
специально я выделю жирным:
с точки зрения компилятора
если вас не интересует точка зрения компилятора,
тогда мне не очевидно, зачем вообще вы начали развивать эту тему.

Цитата Сообщение от ct0r Посмотреть сообщение
Они не связаны друг с другом никак.
очевидно жеж, что связаны.
от этого зависит способность компилятора оптимизировать, например.

Цитата Сообщение от ct0r Посмотреть сообщение
он никакого влияния на определение побочного эффекта не оказывает.
это где то на грани фолла.
я конечно согласен с вами, что определение самолета не зависит от оптимизации его маршрута.
но мне бы и в голову не пришло думать о подобных бреднях.

Цитата Сообщение от ct0r Посмотреть сообщение
Давай продолжим: побочные эффекты, которые - (есть) (представляют собой) изменения в состоянии среды исполнения.
ну давайте:
"самолеты, которые доставляют почту в южные страны..."

ахренительное определение самолетов.

Цитата Сообщение от ct0r Посмотреть сообщение
Такое ощущение, как будто ты на экзамене и выкручиваешься, чтобы тебе пару не влепили.
обычный здравый смысл в отличии от.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.12.2015, 14:57     Что такое side-effects
Еще ссылки по теме:

C++ Что такое хэндлер файла? Что такое файловый указатель?
Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами? C++
Объяснить что такое "раздельная компиляция", что такое "интерфейс класса" и "реализация класса" на примере C++

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

Или воспользуйтесь поиском по форуму:
ct0r
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
31.12.2015, 14:57     Что такое side-effects #20
Цитата Сообщение от hoggy Посмотреть сообщение
с точки зрения компилятора
если вас не интересует точка зрения компилятора,
тогда мне не очевидно, зачем вообще вы начали развивать эту тему.
Так это ты начал со своим компилятором, которому в этой теме вообще не место.

Цитата Сообщение от hoggy Посмотреть сообщение
очевидно жеж, что связаны.
от этого зависит способность компилятора оптимизировать, например.
Стакан тоже можно на стол поставить. И что с того? Они связаны до гроба?

Цитата Сообщение от hoggy Посмотреть сообщение
ну давайте:
"самолеты, которые доставляют почту в южные страны..."
Самолеты, которые - большие офигительные машины. Подучи и русский, чтобы хоть документацию нормально писать.

Цитата Сообщение от hoggy Посмотреть сообщение
обычный здравый смысл в отличии от.
Тупая упертость онли.

Добавлено через 3 минуты
PS И расширь свой кругозор, поучи функциональую парадигму, а то грустно все...
Yandex
Объявления
31.12.2015, 14:57     Что такое side-effects
Ответ Создать тему
Опции темы

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