Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective-C是否有C++;11右值引用和移动语义等价物,或者如何实现? 我正在学习Objto-C过程,我有这样一个“学术”问题,它是针对现代C++的(C++)11的精通的Objul-C专家。_C++_Objective C_C++11_Copy Constructor_Move Semantics - Fatal编程技术网

Objective-C是否有C++;11右值引用和移动语义等价物,或者如何实现? 我正在学习Objto-C过程,我有这样一个“学术”问题,它是针对现代C++的(C++)11的精通的Objul-C专家。

Objective-C是否有C++;11右值引用和移动语义等价物,或者如何实现? 我正在学习Objto-C过程,我有这样一个“学术”问题,它是针对现代C++的(C++)11的精通的Objul-C专家。,c++,objective-c,c++11,copy-constructor,move-semantics,C++,Objective C,C++11,Copy Constructor,Move Semantics,在C++11中,我经常使用移动语义(使用对临时对象的引用可以避免不必要的复制): 这些链接针对不熟悉移动语义概念的objective-c编码人员,我感兴趣的是objective-c是否有类似的功能,或者是否有一些方法来实现/模拟它 Objective-C是否有类似的功能,或者是否有一些方法可以实现/模拟这一功能 没有。这不是一个大问题,一旦您消化了您正在使用Objective-C的抽象层,就可以理解对象是引用计数的,并且是堆分配 现在有两种方法可以解决这个问题: a) 使用Objective

在C++11中,我经常使用移动语义(使用对临时对象的引用可以避免不必要的复制):

这些链接针对不熟悉移动语义概念的objective-c编码人员,我感兴趣的是objective-c是否有类似的功能,或者是否有一些方法来实现/模拟它

Objective-C是否有类似的功能,或者是否有一些方法可以实现/模拟这一功能

没有。这不是一个大问题,一旦您消化了您正在使用Objective-C的抽象层,就可以理解对象是引用计数的,并且是堆分配

现在有两种方法可以解决这个问题:

a) 使用Objective-C++--只需将语言功能与您的内容混合并匹配即可

b) 使用惯用的Objective-C。这可以追溯到很久以前。一旦您接受对象是引用计数的堆分配,并且没有办法解决这个问题(使用叮当),那么您将学会以不同的方式处理程序。当然,引用计算所有内容并将其放在堆中是有代价的,但在某些情况下,您可以利用这些特性。最显著的用途是使用不可变对象和浅层复制。将
std::string
复制为对象将导致SSO复制或堆分配。复制
NSString
可以简单地返回自身(在增加或不增加引用计数后,根据字符串的类型,可能还需要在该点创建具体副本)。同样,这些对象都只是指针,所以您不需要主动关注如何传递对象(value/reference/const reference/move)。ObjC中存在一个简单得多的模型,可以加以利用。因此,这里的设计发生了变化:ObjC中的“价值主导”更少,更多的是“支持不变性和共享”

在某些情况下,可以编写move方法。由于通用框架类不支持这一点,因此使用对象组合通常更有意义

因为对象是在堆上分配的,所以移动就不那么重要了。设计良好的类将成本考虑在内,以最小化庞大/昂贵的副本,并在内部使用一些有趣的优化。这个成语只是建议您应该采用不同的方法来创建类——它们如何共享数据?什么是可变的?必须复制什么?有时,您可能要处理大的、可变的/昂贵的数据,移动会很方便,但您通常可以将其放在共享容器对象中,或者重新考虑对象初始化的语义,以最小化物理复制(并避免对象接口中的奇怪语义)。除此之外,在纯Objul-C中,我不经常看到移动非常有用。当然,它们对于C++库来说是重要的,它们被设计为使用移动语义,并且能够在多个内存位置创建对象。如果确实要移动,通常会希望将该细节保持为私有或使其变得非常明显(例如,我在渲染管道中这样做是为了最大限度地减少每个过滤器的大量分配)


你认为它有益的例子也有助于理解你的问题/原理。< /P> < P> Objy-C没有C++所没有的这些特性,因为Objto-C是纯C之上的一组特定的特征。 <> P>移动语义在C++中如此重要的一个方面是C++对价值语义的高度重视。通常,你不保存指向C++对象的指针,你用值保存C++对象。如果没有移动语义,这将导致大量不必要的副本

Objective-C不仅没有同样强调值语义,而且完全禁止Objective-C对象的值语义;只能动态创建Objective-C对象,不能以复制C结构的方式复制对象,等等

@interface Foo
@end
@implementation Foo
@end

int main() {
    Foo f;
    Foo *a, *b;
    *a = *b;
}

error: interface type cannot be statically allocated
Foo f;
    ^
    *
error: cannot assign to class object ('Foo' invalid)
*a = *b;
   ^

<引用和移动的C++概念都是用ObjtoC C中的C方法和指针来完成的。当然,这意味着C++和Objy-C相比,在C上有很多相同的性能优势,因为它避免指针的能力。

我不理解“对象语义”和“价值语义”是什么。这是你编的吗?如果是这样的话,请更清楚地解释你在追求什么。@KerrekSB:提问者并没有编造出来,但我认为他所说的“对象语义学”,我称之为“实体语义学”。简言之,具有实体语义的类型具有对象标识的概念,这对该类型的用户有用/有意义/无论什么,而具有值语义的类型只能通过值与
=
进行比较。很明显,差异会变得模糊,这是一个设计目标,而不是类型的严格属性。在C++中,它经常与可复制和不可复制类型之间的差异:实体不常规复制。我认为这是Objto-C问题,不是C++问题,C++可能是次要标签,而[等价物]是误导的。询问Objective-C专家,假设他们对C++11知之甚少,因此,在Objto-C中,你想更详细地说明什么。我对ObjuleC几乎一无所知,但也许这有帮助:@亚力山大,如果你用C++的11个特性描述一些非C++专家的话,那么Objul-C专家将能够帮助。那时你会有更多的听众,更多的成功机会。最好的是描述你想做的ObjuleC——用C++尽可能少的…