【发布时间】:2011-01-24 14:25:12
【问题描述】:
http://clang.llvm.org/docs/BlockLanguageSpec.txt
看起来很酷。
然而,
- 我不明白。
- 我没有看到示例。
- 我没有看到难以用 C++ 原样表达的想法示例,但用块表达却微不足道。
谁能告诉我这个?
【问题讨论】:
标签: c++ objective-c clang objective-c-blocks clang-extensions
http://clang.llvm.org/docs/BlockLanguageSpec.txt
看起来很酷。
然而,
谁能告诉我这个?
【问题讨论】:
标签: c++ objective-c clang objective-c-blocks clang-extensions
据我了解,此扩展适用于 Apple 的 Grand Central Dispatch 框架。块是可以并行运行的微型可调度/可排队实体。
【讨论】:
它们基本上只是 Apple 对closures/匿名函数的称呼。正如 Nikolai 所说,它们是您使用 Grand Central Dispatch 并行运行多个功能(因此使用多个内核)而不必担心线程和锁定的方式。
【讨论】:
块本质上是一种将代码和范围作为数据传递的方式。它们在其他一些语言中被称为闭包和匿名函数。
这是一个article,其中包含更多详细信息和代码示例。
【讨论】:
NanoTech 已经链接到块的解释。至于这与 C++ 的关系,让我陈述一下我的个人观点:这个扩展在 C++ 中不有用。原因如下:
关于块引用类型:我们已经有了可以携带一些状态的“多态函数”,参见boost::function、tr1::function。 C++ 将在其下一个标准库中包含一个完善的版本。与“C 块”相比的优势在于,您不需要弄乱Block_copy 和Block_release 之类的东西。这些多态函数对象足够聪明,可以进行自己的内存管理。
关于块文字语法:这是一种很好的语法,它允许您将代码放在它“所属”的位置,而无需大量样板代码。但这同样适用于它的 C++ 对应部分:C++0x lambdas。但是 C++0x 的 lambda 特性还允许您在紧密的内部循环中使用 lambda 对象,而不会由于可能的内联而导致函数调用的高性能成本。
由于 C++0x lambdas 也可以用于性能问题并且 std::function 更容易处理 w.r.t 的情况。内存管理向 C++ 添加“C 块”似乎是多余的。 “C 块”似乎更适合不支持模板或析构函数的语言。
【讨论】:
更多关于积木及其工作原理的信息,您可以参考以下内容:
【讨论】: