Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.76/41: Рейтинг темы: голосов - 41, средняя оценка - 4.76
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826

Что такое side-effects

30.12.2015, 18:09. Показов 8271. Ответов 27
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день,

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

По анализу вопросу понял, что это: если функция не умеет внешних связей и работатет по принципу:
вы мне запрос - я вам ответ.
То такая функция без side-effect'ов.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.12.2015, 18:09
Ответы с готовыми решениями:

Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами?
Что такое файловый буфер? Что такое режим (модификатор) доступа, при работе с файлами?

Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа?
Что такое рекурсивный тип данных? Что такое конструкция рекурсивного типа?

Что такое хэндлер файла? Что такое файловый указатель?
Что такое хэндлер файла? Что такое файловый указатель?

27
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
30.12.2015, 18:17
Так вот же ж:
https://en.wikipedia.org/wiki/... science%29
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
30.12.2015, 18:25  [ТС]
Я прочитал достаточно информации на википедии, stackoverflow и других ресурсах, чтобы нормально так запутаться. Везде вода, зачем не понятно, как использовать знания полученые прочитав ту или инную статью - не понятно. Что это вещь спасёт мир всём понятно, но никто не говорит кейсы дальше чем
C++
1
2
3
4
5
int f(int& a)
{
a++;
return a - 7;
}
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
30.12.2015, 18:35
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Я прочитал достаточно информации на википедии, stackoverflow и других ресурсах, чтобы нормально так запутаться. Везде вода, зачем не понятно, как использовать знания полученые прочитав ту или инную статью - не понятно.
Не знаю, что тебе там непонятно. На википедии все доступно написано и объяснено. Разве что многопоточную среду не упоминают. Читай внимательно, а не бегло.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
30.12.2015, 19:04
Лучший ответ Сообщение было отмечено rikimaru2013 как решение

Решение

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) Порядок вычисления аргументов теперь не определен.

Резюмируя: никогда не полагайся на ленивость оператора && (и подобных с тем же свойством), если существует ненулевая вероятность, что в данном контексте он может быть перегружен. Ленивостью обладает только встроенная версия, а пользовательская перегрузка обладает только свойствами обычной функции.
6
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
30.12.2015, 23:28
Лучший ответ Сообщение было отмечено rikimaru2013 как решение

Решение

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
что такое side-effects и с чем их едят?
побочные эффекты.

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

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

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

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


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

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

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

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

там есть ссылки на оригинальный текст.
а ниже - перевод на русском.
3
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
30.12.2015, 23:51  [ТС]
Цитата Сообщение от hoggy Посмотреть сообщение
какой то идиот вкрячил в конструктор копии сайд эффект
если вы про мою вчерашнюю тему, где я писал о "возможной магии в copy constr" - намёк понял )))
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
30.12.2015, 23:57
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
если вы про мою вчерашнюю тему, где я писал о "возможной магии в copy constr" - намяк понял )))
нет никаких намеков.
вашу тему вероятно я даже не видел,
поскольку не знаю о чем это вы сейчас.

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

одна из причин, из-за которой считается, что "глобальные переменные - зло",
связанна с тем, что манипуляции с глобальными переменными - суть побочные эффекты.
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
31.12.2015, 01:15  [ТС]
hoggy, вызов другого метода в методе является side-effect'ом? Как бы метод зависит от результатов работы др метода (и/или вызов статического метода синглтона)
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
31.12.2015, 01:18
Лучший ответ Сообщение было отмечено rikimaru2013 как решение

Решение

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
вызов другого метода в методе является side-effect'ом?
да, если компилятор не имеет возможности узнать, что внутри этого метода.

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

если не доступен, то он должен сделать вызов,
не зная к чему это приведет.
это "не знание" и есть "побочный эффект" с точки зрения компилятора.
1
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
31.12.2015, 01:34  [ТС]
hoggy, тогда как компилятор не смог увидить перегрузки для if(a++ && b++ && c++) {}
и соптимизировать код. На этапе компиляции - все поведения определены
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
31.12.2015, 01:39
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.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
31.12.2015, 01:44
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
тогда как компилятор не смог увидить перегрузки для if(a++ && b++ && c++) {}
и соптимизировать код. На этапе компиляции - все поведения определены
вопрос не понятен.

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

в данном случае имеет место быть ленивым вычислениям:
Code
1
2
если 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.
здесь нет определения термина "побочный эффект".
1
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
31.12.2015, 02:08
Цитата Сообщение от hoggy Посмотреть сообщение
вы просто вдумайтесь: "понятие с точки зрения компилятора".
как бе понятно, что это именно что понятие,
а не формальная терминология.
и это понятие существует для того,
что бы можно было понять сабж.
Я безусловно понял, что ты имеешь в виду. Но это, опять же, как ты сам сказал, твое личное понятие. Которое не принято ни в стандарте, ни вообще в computer science.

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

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

Зачем такие функции нужны:
1) их легче понимать
2) их легче сопровождать
3) их легче отлаживать
4) их легче тестировать
5) их легче переиспользовать
6) их легче верифицировать.
3
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
31.12.2015, 02:59
Цитата Сообщение от ct0r Посмотреть сообщение
side effects - это как раз оно, если че
там говориццо что является побочным эффектом,
но не говориццо, что такое "побочный эффект"

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

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

а если рассуждать с точки зрения "понятия" которое я дал в #10,
то уточнениям "точкам следования" с++11 оно никак не противоречит.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
31.12.2015, 05:10
Цитата Сообщение от hoggy Посмотреть сообщение
там говориццо что является побочным эффектом,
но не говориццо, что такое "побочный эффект"
Да как не говорится? Вот: side effects, which are changes in the state of the execution environment. Все, что после which, относится именно к определению side effects, а не ко всему предыдущему.

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

Цитата Сообщение от hoggy Посмотреть сообщение
то уточнениям "точкам следования" с++11 оно никак не противоречит.
Из твоего понятия следует, что вызов абсолютно любой незаинлайненной функции - это побочный эффект. Но это не так, потому что побочный эффект при вызове функции получается - только если эта вызываемая функция с побочным эффектом.
К тому же в С++11 уже нет такой штуки как точки следования. Давай не пользоваться старой терминологией.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
31.12.2015, 14:18
Цитата Сообщение от ct0r Посмотреть сообщение
Но это бред, потому что побочный эффект при вызове функции получается - только если эта вызываемая функция с побочным эффектом.
объясните это компилятору, который не телепат, и не знает, что там внутри.

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

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

там нет определения, что есть "сайт эффект".
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
31.12.2015, 14:33
Цитата Сообщение от hoggy Посмотреть сообщение
объясните это компилятору, который не телепат, и не знает, что там внутри.
Мы тут про побочные эффекты или про компилятор? Они не связаны друг с другом никак. Поэтому мне абсолютно всё равно, что и как там с компилятором, поскольку он никакого влияния на определение побочного эффекта не оказывает.

Цитата Сообщение от hoggy Посмотреть сообщение
"..сайд эффейты, которые..."
там нет определения, что есть "сайт эффект".
Ты всегда английский так переводишь - первые 3 слова? Давай продолжим: побочные эффекты, которые - (есть) (представляют собой) изменения в состоянии среды исполнения. Такое ощущение, как будто ты на экзамене и выкручиваешься, чтобы тебе пару не влепили.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
31.12.2015, 14:46
Цитата Сообщение от ct0r Посмотреть сообщение
Мы тут про побочные эффекты или про компилятор?
текущее сообщение - ответ на ваше сообщение,
которое ответ на моё предыдущее сообщение,
ключевое слово которого было:
Цитата Сообщение от hoggy Посмотреть сообщение
это "не знание" и есть "побочный эффект" с точки зрения компилятора.
специально я выделю жирным:
с точки зрения компилятора
если вас не интересует точка зрения компилятора,
тогда мне не очевидно, зачем вообще вы начали развивать эту тему.

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

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

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

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

Цитата Сообщение от ct0r Посмотреть сообщение
Такое ощущение, как будто ты на экзамене и выкручиваешься, чтобы тебе пару не влепили.
обычный здравый смысл в отличии от.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
31.12.2015, 14:57
Цитата Сообщение от hoggy Посмотреть сообщение
с точки зрения компилятора
если вас не интересует точка зрения компилятора,
тогда мне не очевидно, зачем вообще вы начали развивать эту тему.
Так это ты начал со своим компилятором, которому в этой теме вообще не место.

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

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

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

Добавлено через 3 минуты
PS И расширь свой кругозор, поучи функциональую парадигму, а то грустно все...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.12.2015, 14:57
Помогаю со студенческими работами здесь

Что такое заголовочный файл? Что такое файл исходного кода? Рассмотрите назначение каждого из них
Что такое заголовочный файл? Что такое файл исходного кода? Рассмотрите назначение каждого из них пожалуйста.

Как используется coLinux? Что значит соиспользование Linux и Windows side by side
Я не про выбор ОС при загрузке bios, Topologilinux, например, по англовике устанавливается на виндовс

Ремонт Х-к Teka NF660i side by side нет регулировки температуры в морозильнике
Не знаю,чей это клон,надо направление поиска неисправности узнать для того,чтобы холодильщика отправить на сабж В холодильной камере...

Ремонт Холодильник Акаi ARL2522MS side-by-side, доза фреона 600а
Холодильник AKAI side-by-side ARL 2522MS морозилка-180л/холодилка-341л.Серийный номер-BCOTDOE0300BA7790094 подскажите норму заправки...

Холодильник BOSCH KFU 5750/03 (side by side), Подобрать компрессор
Вечер добрый. Подскажите какой компрессор должен стоять на Холодильнике BOSCH KFU 5750/03 (side by side), R-134a 170гр, или аналог не очень...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
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 - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru