C++ 0x lambda vs blocks

Maz*_*Maz 12 c++ lambda objective-c-blocks c++11

我今天正在探索C++ 0x,我遇到了新的lambda功能.我的问题是,这些不同(在使用方面)与有何不同,为什么一个人比另一个更喜欢?

谢谢.

djh*_*987 5

C++ 0x lambdas有一个简短的语法,可以通过引用获取范围内的每个变量.([&])lambda的类型也未指定,允许更优化的代码.

现在,当您查看Apple块时,它将需要将__block说明符添加到您要修改的变量中(事实上,这是必需的,这表明整个系统存在缺陷).变量是通过引用获取的,但是当块退出范围时(或者复制的上下文必然存在于堆上,似乎)通过值获取.一种奇怪的语义只能导致破坏的设计,但可能会让喜欢GC的人感到高兴.当然,不用说这可能具有相当高的效率成本,因为这需要特殊的间接性.

声称C++ 0x lambdas语法会破坏与C程序的兼容性,但我不认为这是真的.但是,将它与C集成可能还有其他问题,主要是C无法真正处理未指定类型和构建类型擦除的事实.

Apple块实际上只是一个ObjC功能,他们试图推广到其他语言.对于C++,为该语言设计的系统要好得多.

编辑:

为了正确地给予信任,我从http://www.rhinocerus.net/forum/language-c-moderated/558214-blocks-vs-c-lambdas.html很久以前就获得了这些信息.那条链接已经死了; 然而,原来的讨论似乎在这里存档,感谢@stefan找到它.

  • 另外,lambdas是c ++的一部分,不是块.所以lambdas是便携式的.阻止没有. (4认同)

Jer*_*fin 5

我认为这基本上归结为你的起点问题.如果您从Objective-C开始,并主要(或专门)编写C++(Objective-C++)作为Objective-C的附件,那么在所有代码中使用块可能是有意义的,只需保留尽可能多的通用性跨代码库.即使(例如)一个项目中使用用Objective-C和其他C++一些作品,它可能是有意义的两个保留整个代码库尽可能多的相似性所需要的区块.

但是,除非你在C++之外使用它们,否则我认为没有理由比C++ lambdas更喜欢块.在什么我猜是最常见的使用(在算法谓词或动作)两者之间的唯一明显的区别将是一个开头^和其他同[].

较旧版本的Objective C++

在ARC之前,块和lambdas的实现存在内部差异,这可能会影响一些更高级的用途.例如,块像C字符串一样模糊,因此您使用Block_copy复制一个,Block_release来释放副本,依此类推.另一方面,在C++中,这一切都是自动化的,因此copy ctor会根据需要自动使用Block_copy和dtor Block_release.同时,它确实涉及更多"魔术",因此(例如)复制块时,无论源是如何分配的,都始终动态分配副本.

如果出于某种原因,你仍然坚持使用较旧的(我很想说"古老")编译器或维护较旧的代码(并且不希望整个代码库更新)内存管理的区别可能值得考虑.

  • 这个答案可能应该更新,现在我们知道在Objective-C++中,块和lambdas是等价的(它们可以相互分配,可复制,以及它们现在都由系统管理,而不是用户管理(ARC)照顾那个). (2认同)