Никакой C++ не является действительно надмножеством C. Можно проверить эту статью на более обширный список различий, если Вам интересно: http://en.wikipedia.org/wiki/Compatibility_of_C_and_C%2B%2B
Аргумент состоит в том, что наличие замыканий на вашем языке программирования упрощает выполнение некоторой работы в другом потоке. Я думаю, что автору следовало упомянуть важность функции высшего порядка в этом аргументе.
Мое любимое введение в функции высшего порядка - «Почему функциональное программирование имеет значение» , я не буду пытаться представить здесь плохая реплика.
Таким образом, использование замыканий не дает вам бесплатного параллелизма, если вы собираетесь выполнять замыкания в циклах for, например
for (int i = 0; i < numElements; i++) {
result[i] = closure(inputs[i], i);
}
, потому что язык не может определить, является ли закрытие (a, б)
каким-то образом изменяет другие значения в массивах результатов или входов. Но языки с функциями высшего порядка, такими как map
, указывают, что функция, переданная в map
, не должна ' t просматривать или изменять другие значения во входных данных и предотвращать их влияние на другие результаты. Таким образом, такой код, который является общим для функциональных языков, можно распараллелить за вас, без необходимости создавать пул рабочих потоков и передавать им закрытие:
results = map(closure, inputs, [0..numElements-1]);
В этих языках замыкания снимают боль объявления где-нибудь новой функции для коротких фрагментов кода. Это делает более увлекательным использование функций высшего порядка.
Следующий код Haskell определяет функцию f
, которая принимает список чисел и возвращает список, где каждый вход i
является заменено на 2i + 1
. Благодаря тому, что вы избавитесь от хлопот по созданию функции для вычисления 2i + 1
, это будет 1 строка кода вместо 2.
f nums = map (\i -> 2*i+1) nums
Снова см. «Почему функциональное программирование имеет значение»
Вот хорошее определение замыканий:
«Закрытие» - это выражение (обычно функция), которая может иметь свободные переменные вместе с среда, которая связывает эти переменные (который «закрывает» выражение.)
Я думаю, вы сбиваете с толку определения, так как, например, в javascript мои замыкания часто могут иметь нелокальные побочные эффекты, поскольку я меняю DOM.
полезны, поэтому C # добавил их в язык.
В таких языках, как язык функционального программирования, кажется, что они не обязательно создают потоки, за которые вы должны платить из-за переключения контекста, но создают легкие процессы. Фреймворк или компилятор будет контролировать, что создавать, чтобы обеспечить оптимальное использование процессора.
Пишете ли вы с замыканиями, менее важно, чем если бы вы использовали неизменяемые данные.
Например, если у меня есть приложение, которое не имеет глобальных данных, но каждый поток использует свою локальную копию, тогда ОС и планировщик должны определить, какие ядра будет использовать мое приложение. К сожалению, в C / C ++ компиляторы не знают, как это сделать, поэтому, перейдя на FP, мы можем перейти к фреймворкам, таким как Erlang, которые долгое время имели дело с распределенной обработкой, и использовать их опыт.
Актеры в чем-то вроде Erlang будут иметь меньше накладных расходов, чем поток C / C ++, поскольку переключение с актерами кажется более быстрым.