【问题标题】:How do Clang 'blocks' work?Clang“块”如何工作?
【发布时间】:2011-01-24 14:25:12
【问题描述】:

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

看起来很酷。

然而,

  1. 我不明白。
  2. 我没有看到示例。
  3. 我没有看到难以用 C++ 原样表达的想法示例,但用块表达却微不足道。

谁能告诉我这个?

【问题讨论】:

标签: c++ objective-c clang objective-c-blocks clang-extensions


【解决方案1】:

据我了解,此扩展适用于 Apple 的 Grand Central Dispatch 框架。块是可以并行运行的微型可调度/可排队实体。

【讨论】:

  • 耶稣。 GCD 是使用块的一个 API。但是说它们是该框架的扩展是荒谬的。他们为语言添加了闭包。不多也不少。使用它们的框架的存在对它们的目的或起源没有任何影响。
【解决方案2】:

它们基本上只是 Apple 对closures/匿名函数的称呼。正如 Nikolai 所说,它们是您使用 Grand Central Dispatch 并行运行多个功能(因此使用多个内核)而不必担心线程和锁定的方式。

【讨论】:

  • 不是 Apple 的术语。该术语来自 Smalltalk。 Objective-C 可以看作是 C 和 Smalltalk 的混合体。一个较早的非 Apple/非 Next Objective-C 编译器(称为 PoC)在多年前添加了块并使用了 Smalltalk 术语。因此,Smalltalk 术语也被用于 Apple 的实施是很自然的。
  • 我并不是要暗示 Apple 发明了它,只是他们选择在 Objective-C 2.0 中使用的术语(以及,通过扩展,由 Apple 资助的 clang 项目的术语) .
  • 我认为 Objective-C 深受 Smalltalk 的影响,并且使用了相当多的术语。 Objective-C 已经存在了很长一段时间(IIRC 实际上比 C++ 更早),当时 Smalltalk 是这类事情的黄金标准。
【解决方案3】:

块本质上是一种将代码和范围作为数据传递的方式。它们在其他一些语言中被称为闭包和匿名函数。

这是一个article,其中包含更多详细信息和代码示例。

【讨论】:

  • 顺便说一句,C++ 的下一个版本也有闭包,通过 lambda 语法。
  • 顺便说一句,current 版本的 C++ 也有闭包,通过 lambda 语法。
  • 顺便说一句,C++ 的 previous 版本也有闭包,通过 lambda 语法。
【解决方案4】:

NanoTech 已经链接到块的解释。至于这与 C++ 的关系,让我陈述一下我的个人观点:这个扩展在 C++ 中有用。原因如下:

关于块引用类型:我们已经有了可以携带一些状态的“多态函数”,参见boost::functiontr1::function。 C++ 将在其下一个标准库中包含一个完善的版本。与“C 块”相比的优势在于,您不需要弄乱Block_copyBlock_release 之类的东西。这些多态函数对象足够聪明,可以进行自己的内存管理。

关于块文字语法:这是一种很好的语法,它允许您将代码放在它“所属”的位置,而无需大量样板代码。但这同样适用于它的 C++ 对应部分:C++0x lambdas。但是 C++0x 的 lambda 特性还允许您在紧密的内部循环中使用 lambda 对象,而不会由于可能的内联而导致函数调用的高性能成本。

由于 C++0x lambdas 也可以用于性能问题并且 std::function 更容易处理 w.r.t 的情况。内存管理向 C++ 添加“C 块”似乎是多余的。 “C 块”似乎更适合不支持模板或析构函数的语言。

【讨论】:

  • 我不确定您所说的“多态”是指您认为的意思。
  • @Jonathan:我没有发明这个词。请参阅当前的 C++ 标准草案 (N3092.pdf),第 20.8.15 节,“多态函数包装器”。它们是多态的,只要签名兼容,您就可以在其中包装任何函数对象。被包裹对象的确切类型被隐藏(“擦除”)。这是通过“经典的 OOP 多态性”(或类似的东西)实现的。
【解决方案5】:
猜你喜欢
  • 2020-02-20
  • 2021-12-03
  • 1970-01-01
  • 2018-04-29
  • 2016-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多