Evgenii Legotckoi
21 августа 2019 г. 15:45

C++14 - лямбда функция с кэшируемым возвращаемым значением

Содержание

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

Чтобы избежать множественных вызовов тяжелой функции, мы можем кэшировать значение, которое возвращает тяжелая функция.


Пример кода

  1. #include <iostream>
  2. #include <string>
  3.  
  4. using namespace std;
  5.  
  6. int heavy_calc(int base) // heavy function that we want to call once
  7. {
  8. cout << "heavy_calc" << std::endl;
  9. // sleep(+100500 years)
  10. return base * 25;
  11. }
  12.  
  13. void calclulateValue(int base)
  14. {
  15. // The following construction allows you to cache the result of executing a heavy function for the duration of one call to calclulateValue
  16. auto foo
  17. {
  18. [cache = heavy_calc(base)]()
  19. {
  20. return cache;
  21. }
  22. };
  23. // We call the lambda twice with the cached heavy calc value
  24. // In this case, heavy calc is called only once
  25. int fooFoo = foo() + foo();
  26. cout << fooFoo << std::endl;
  27. }
  28.  
  29. int main()
  30. {
  31. // Call calclulateValue twice with a different base value,
  32.     // to show that the cache is reset every time calclulateValue is called
  33. calclulateValue(1);
  34. calclulateValue(10);
  35. return 0;
  36. }

Результат

  1. heavy_calc
  2. 50
  3. heavy_calc
  4. 500

Вам это нравится? Поделитесь в социальных сетях!

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь