Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do Clang 'blocks' work?

http://clang.llvm.org/docs/BlockLanguageSpec.txt

Looks really cool.

However,

  1. I don't understand it.
  2. I don't see examples it.
  3. 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?

like image 477
anon Avatar asked Mar 07 '10 03:03

anon


People also ask

What does __ block do?

__block is a storage qualifier that can be used in two ways: Marks that a variable lives in a storage that is shared between the lexical scope of the original variable and any blocks declared within that scope. And clang will generate a struct to represent this variable, and use this struct by reference(not by value).

What is C blocks?

A C block is a block that is shaped like a “C”, so other blocks can fit inside it. These blocks perform the conditions and loops.

What is a block pointer in C?

A block definition produces an opaque value which contains both a reference to the code within the block and a snapshot of the current state of local stack variables at the time of its definition. The block may be later invoked in the same manner as a function pointer.

What part of a block literal is optional since it will be inferred by the compiler?

Block Literal Expressions produces a reference to a Block with no arguments with no return value. The return type is optional and is inferred from the return statements.


2 Answers

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.

like image 120
nanotech Avatar answered Sep 22 '22 20:09

nanotech


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.

like image 23
sellibitze Avatar answered Sep 21 '22 20:09

sellibitze