http://clang.llvm.org/docs/BlockLanguageSpec.txt
Looks really cool.
However,
- I don't understand it.
- I don't see examples it.
- I don't see examples of ideas hard to express in C++ as is, but trivial to express in blocks.
Can anyone enlighten me on this?
Blocks are, essentially, a way to pass code and scope around as data. They're known in some other languages as closures and anonymous functions.
Here's an article with more details and code examples.
NanoTech already linked to an explanation of blocks. As for how this relates to C++ let me state my personal opinion: This extension is not useful in C++. Here's why:
Regarding the block reference type: We already have "polymorphic functions" which can carry some state around, see boost::function, tr1::function. C++ will include a polished version of this in its next standard library. The advantage over "C Blocks" is that you don't need to mess with things like Block_copy
and Block_release
. These polymorphic functions objects are smart enough to do their own memory managing.
Regarding the block literal syntax: It's a nice syntax that allows you to put the code where it "belongs" without the need for much boilerplate code. But the same applies to its C++ counter part: C++0x lambdas. But C++0x lambda feature also allows you to use lambda objects in tight inner loops without high performance costs of function calls due to possible inlining.
Since C++0x lambdas can be also used in situations where performance is an issue and std::function is easier to handle w.r.t. memory management the addition of "C Blocks" to C++ seems redundant. "C blocks" seem to be more tailored to languages that don't support templates or destructors.
For more on blocks and how they work, you can refer to the following:
- Introducing Blocks and Grand Central Dispatch
- Blocks Programming Topics
- Cocoa for Scientists (Part XXVII): Getting Closure with Objective-C
- Cocoa for Scientists (XXXI): All Aboard Grand Central
- Concurrency Programming Guide: Implementing Tasks Using Blocks
- Cocoa Core Competencies: Block Object
They're basically just Apple's term for closures/anonymous functions. As Nikolai notes, they're how you use Grand Central Dispatch to run multiple functions in parallel (thus using more than 1 core) without having to worry about threading and locking.
As far as I understand this extension is for Apple's Grand Central Dispatch framework. Blocks are tiny schedulable/queue-able entities to be potentially run in parallel.