This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: apple blocks extension



On Sep 24, 2009, at 7:57 AM, Jason Merrill wrote:


On 09/15/2009 12:35 PM, Chris Lattner wrote:
The second major feature of Blocks vs c++ lambdas is that they can be
"copied onto the heap". This allows things like "Grand Central Dispatch"
to work: you can write code that executes blocks asynchronously or on
other threads/work queues (after the function containing the block has
returned). A simple example is:


void print_on_different_thread(int X) {
 run_asynch(^{
   printf("Hi %d\n", X);
 });
}

With lambdas, the closure would be go out of scope when
print_on_different_thread returns, but blocks allows "run_asynch" to
extend the lifetime of the block.

The lambda equivalent would be


void print_on_different_thread(int X) {
 run_asynch([=]{
   printf("Hi %d\n", X);
 });
}

since X is captured by copy, run_asynch can do whatever it wants with the closure and not worry about the original X going away.

The only difference between blocks and lambdas here seems to be where you decide to copy the locals off the stack.

Can the lambda (containing X) be copied and put onto a queue? What is its type?


-Chris


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]