Loading AI tools
З Вікіпедії, вільної енциклопедії
У програмування, чиста функція — це функція, яка має такі властивості:[1][2]
Отже, чиста функція це обчислювальний аналог математичної функції. Деякі автори, особливо зі спільноти імперативних мов, використовують термін «чиста» для всіх функцій, що мають лише другу зі щойно наведених властивостей[3] (обговорено нижче).
Наступні приклади функцій з C++ чисті:
floor
, повертає цілу частину числа;max
, повертає більше з двох значень.void f() {
static std::atomic<unsigned int> x = 0;
++x;
}
x
можна спостерігати всередині викликів f()
і через те, що f()
не повідомляє значення x
назовні, вона невідрізненна від функції void f() {}
, яка нічого не робить. Зауважте, що x
це std::atomic
, тому зміни з багатьох потоків, що виконують f()
конкурентно не спричиняють стан гонитви, який призводить до невизначеної поведінки в C і C++.Наступні функції C++ нечисті, бо їм бракує властивості 1:
int f() {
static int x = 0;
++x;
return x;
}
int f() {
return x;
}
sin()
не чиста, бо її наслідок залежить від режиму заокруглення IEEE, який можна змінити під час виконання.int f(int* x) {
return *x;
}
int f() {
int x = 0;
std::cin >> x;
return x;
}
Наступні функції в C++ нечисті, бо вони не мають властивості 2:
void f() {
static int x = 0;
++x;
}
void f() {
++x;
}
void f(int* x) {
++*x;
}
void f() {
std::cout << "Hello, world!" << std::endl;
}
Наступні функції в C++ нечисті, бо вони не мають обох властивостей:
int f() {
static int x = 0;
++x;
return x;
}
int f() {
int x = 0;
std::cin >> x;
return x;
}
Функції, що мають лише другу властивість дозволяють такі компіляторні техніки оптимізації як усунення спільних підвиразів і оптимізація циклів.[3] Приклад на C++ це метод length
, що повертає розмір рядка, що залежить від вмісту пам'яті, на яку вказує змінна, що порушує властивість 1. Проте, в однопотоковому середовищі, наступний код на C++
std::string s = "Hello, world!";
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int l = 0;
for (int i = 0; i < 10; ++i) {
l += s.length() + a[i];
}
можна оптимізувати так, що значення s.length()
обчислене лише раз, перед циклом.
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.