функція не має побічних впливів (не змінює локальні статичні змінні, нелокальні змінні, змінні аргументи-посилання або потоки введення/виведення).
Отже, чиста функція це обчислювальний аналог математичної функції. Деякі автори, особливо зі спільноти імперативних мов, використовують термін «чиста» для всіх функцій, що мають лише другу зі щойно наведених властивостей[3] (обговорено нижче).
Значення x можна спостерігати всередині викликів f() і через те, що f() не повідомляє значення x назовні, вона невідрізненна від функції void f() {}, яка нічого не робить. Зауважте, що x це std::atomic, тому зміни з багатьох потоків, що виконують f() конкурентно не спричиняють стан гонитви, який призводить до невизначеної поведінки в C і C++.
Нечисті функції
Наступні функції C++ нечисті, бо їм бракує властивості 1:
бо повертане значення змінюється зі зміною статичної змінної
intf(){staticintx=0;++x;returnx;}
бо повертане значення змінюється зі зміною нелокальної змінної
intf(){returnx;}
З тої ж причини, наприклад, бібліотечна функція C++ sin() не чиста, бо її наслідок залежить від режиму заокруглення IEEE, який можна змінити під час виконання.
бо повертане значення змінюється зі зміною мутовного аргумента-посилання
intf(int*x){return*x;}
бо повертане значення залежить від стану потоку введення
intf(){intx=0;std::cin>>x;returnx;}
Наступні функції в C++ нечисті, бо вони не мають властивості 2:
через зміну локальної статичної змінної
voidf(){staticintx=0;++x;}
через зміну нелокальної змінної
voidf(){++x;}
через зміну мутовного аргумента-посилання
voidf(int*x){++*x;}
через зміну потоку виведення
voidf(){std::cout<<"Hello, world!"<<std::endl;}
Наступні функції в C++ нечисті, бо вони не мають обох властивостей:
бо повертане значення змінюється разом з локальною статичною змінною і через зміну локальної статичної змінної
intf(){staticintx=0;++x;returnx;}
бо повертане значення змінюється залежно від стану потоку введення і сам потік введення зазнає змін
intf(){intx=0;std::cin>>x;returnx;}
Оптимізації компілятора
Функції, що мають лише другу властивість дозволяють такі компіляторні техніки оптимізації як усунення спільних підвиразів і оптимізація циклів.[3] Приклад на C++ це метод length, що повертає розмір рядка, що залежить від вмісту пам'яті, на яку вказує змінна, що порушує властивість 1. Проте, в однопотоковому середовищі, наступний код на C++
можна оптимізувати так, що значення s.length() обчислене лише раз, перед циклом.
Примітки
↑Bartosz Milewski (2013). Basics of Haskell. School of Haskell. FP Complete. Архів оригіналу за 27 жовтня 2016. Процитовано 13 липня 2018. Ось засадничі властивості чистих функцій: 1. Функція повертає той самий результат на кожен виклик з тим самим набором аргументів. Інакше кажучи, функція не має стану і не має доступу до зовнішнього стану. Кожного разу коли її викликають вона поводиться як новонароджене дитятко без спогадів і без знань про навколишній світ. 2. Функція не має побічних ефектів. Виклик функції один раз це те саме, що викликати її двічі і відкинути результат першого виклику.