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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
rikimaru2013
C++ Game Dev
2438 / 1132 / 240
Регистрация: 30.11.2013
Сообщений: 3,688
#1

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

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

Добрый день,

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

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

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

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

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

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

Объяснить что такое "раздельная компиляция", что такое "интерфейс класса" и "реализация класса" на примере - C++
Есть класс, содержащий объекты и конструктор. Конструктор объявляется в одном из cpp файлов(их несколько). Можно ли, как-то, использовать...

Что такое перегрузка оператора? Что у меня в коде за ошибка? - C++
Что же я написал?? Что оно не компилится? Что значит error C2275: Superclass: недопустимое использование этого типа в качестве выражения ...

27
ct0r
Игогошка!
1776 / 678 / 42
Регистрация: 19.08.2012
Сообщений: 1,292
Завершенные тесты: 1
30.12.2015, 18:17 #2
Так вот же ж:
https://en.wikipedia.org/wiki/Side_effect_%28computer_science%29
0
rikimaru2013
C++ Game Dev
2438 / 1132 / 240
Регистрация: 30.11.2013
Сообщений: 3,688
30.12.2015, 18:25  [ТС] #3
Я прочитал достаточно информации на википедии, stackoverflow и других ресурсах, чтобы нормально так запутаться. Везде вода, зачем не понятно, как использовать знания полученые прочитав ту или инную статью - не понятно. Что это вещь спасёт мир всём понятно, но никто не говорит кейсы дальше чем
C++
1
2
3
4
5
int f(int& a)
{
a++;
return a - 7;
}
0
ct0r
Игогошка!
1776 / 678 / 42
Регистрация: 19.08.2012
Сообщений: 1,292
Завершенные тесты: 1
30.12.2015, 18:35 #4
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Я прочитал достаточно информации на википедии, stackoverflow и других ресурсах, чтобы нормально так запутаться. Везде вода, зачем не понятно, как использовать знания полученые прочитав ту или инную статью - не понятно.
Не знаю, что тебе там непонятно. На википедии все доступно написано и объяснено. Разве что многопоточную среду не упоминают. Читай внимательно, а не бегло.
0
DrOffset
7351 / 4451 / 1009
Регистрация: 30.01.2014
Сообщений: 7,292
30.12.2015, 19:04 #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) Порядок вычисления аргументов теперь не определен.

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

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

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

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

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


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

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

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

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

там есть ссылки на оригинальный текст.
а ниже - перевод на русском.
3
rikimaru2013
C++ Game Dev
2438 / 1132 / 240
Регистрация: 30.11.2013
Сообщений: 3,688
30.12.2015, 23:51  [ТС] #7
Цитата Сообщение от hoggy Посмотреть сообщение
какой то идиот вкрячил в конструктор копии сайд эффект
если вы про мою вчерашнюю тему, где я писал о "возможной магии в copy constr" - намёк понял )))
0
hoggy
6672 / 2858 / 491
Регистрация: 15.11.2014
Сообщений: 6,379
Завершенные тесты: 1
30.12.2015, 23:57 #8
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
если вы про мою вчерашнюю тему, где я писал о "возможной магии в copy constr" - намяк понял )))
нет никаких намеков.
вашу тему вероятно я даже не видел,
поскольку не знаю о чем это вы сейчас.

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

одна из причин, из-за которой считается, что "глобальные переменные - зло",
связанна с тем, что манипуляции с глобальными переменными - суть побочные эффекты.
0
rikimaru2013
C++ Game Dev
2438 / 1132 / 240
Регистрация: 30.11.2013
Сообщений: 3,688
31.12.2015, 01:15  [ТС] #9
hoggy, вызов другого метода в методе является side-effect'ом? Как бы метод зависит от результатов работы др метода (и/или вызов статического метода синглтона)
0
hoggy
6672 / 2858 / 491
Регистрация: 15.11.2014
Сообщений: 6,379
Завершенные тесты: 1
31.12.2015, 01:18 #10
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
вызов другого метода в методе является side-effect'ом?
да, если компилятор не имеет возможности узнать, что внутри этого метода.

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

если не доступен, то он должен сделать вызов,
не зная к чему это приведет.
это "не знание" и есть "побочный эффект" с точки зрения компилятора.
1
rikimaru2013
C++ Game Dev
2438 / 1132 / 240
Регистрация: 30.11.2013
Сообщений: 3,688
31.12.2015, 01:34  [ТС] #11
hoggy, тогда как компилятор не смог увидить перегрузки для if(a++ && b++ && c++) {}
и соптимизировать код. На этапе компиляции - все поведения определены
0
ct0r
Игогошка!
1776 / 678 / 42
Регистрация: 19.08.2012
Сообщений: 1,292
Завершенные тесты: 1
31.12.2015, 01:39 #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.
1
hoggy
6672 / 2858 / 491
Регистрация: 15.11.2014
Сообщений: 6,379
Завершенные тесты: 1
31.12.2015, 01:44 #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.
здесь нет определения термина "побочный эффект".
1
ct0r
Игогошка!
1776 / 678 / 42
Регистрация: 19.08.2012
Сообщений: 1,292
Завершенные тесты: 1
31.12.2015, 02:08 #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) их легче верифицировать.
3
hoggy
6672 / 2858 / 491
Регистрация: 15.11.2014
Сообщений: 6,379
Завершенные тесты: 1
31.12.2015, 02:59 #15
Цитата Сообщение от ct0r Посмотреть сообщение
side effects - это как раз оно, если че
там говориццо что является побочным эффектом,
но не говориццо, что такое "побочный эффект"

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

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

а если рассуждать с точки зрения "понятия" которое я дал в #10,
то уточнениям "точкам следования" с++11 оно никак не противоречит.
0
31.12.2015, 02:59
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.12.2015, 02:59
Привет! Вот еще темы с ответами:

В этой части кода происходит объявление функций? Что такое void? Что в скобках? - C++
В этой части кода происходит объявление функций? Что такое void? Что в скобках? void get(float **mas, int N, int M); void...

Что такое #, include, что это означает - C++
______

Код не работает,говорит,что не знает,что такое delay(100).в чём проблема?как сделать,чтоб программа заработала? - C++
#include <graphics.h> #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <dos.h> int main() { int...

Кто-нибудь может подробно объяснить, что такое allocators, зачем это и что с ними делать? Нигде не нашёл инфы - C++
Заранее спасибо.


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru