Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.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
C++ 目标C中的消息系统是否依赖于内核消息系统?_C++_Objective C - Fatal编程技术网

C++ 目标C中的消息系统是否依赖于内核消息系统?

C++ 目标C中的消息系统是否依赖于内核消息系统?,c++,objective-c,C++,Objective C,我真的不明白ObjC如何有效地依赖消息。这是否意味着像mach这样的内核必须用这种想法设计 目标C看起来是一种好语言,但我觉得它比C++更难掌握。 用语言构建的消息系统如何成为优势?Objective-C中的消息传递与mach内核中的消息传递没有直接关系。它被实现为一个高度调优的函数,名为objc\u msgSend。电话 [obj messageWithX:x andY:y]; 转换为C调用 objc_msgSend(obj,@selector(messageWithX:andY:),x

我真的不明白ObjC如何有效地依赖消息。这是否意味着像mach这样的内核必须用这种想法设计

目标C看起来是一种好语言,但我觉得它比C++更难掌握。
用语言构建的消息系统如何成为优势?

Objective-C中的消息传递与mach内核中的消息传递没有直接关系。它被实现为一个高度调优的函数,名为
objc\u msgSend
。电话

 [obj messageWithX:x andY:y];
转换为C调用

 objc_msgSend(obj,@selector(messageWithX:andY:),x,y);
objc_msgSend
直接用汇编语言编写,以最大限度地优化。它以一种非常有效的方式动态解析方法调用。这将是一个很好的开始了解它是如何实现的地方

是否比C++更容易或更难掌握取决于你的背景和品味。C++和Objule-C支持的面向对象的味道有很大的不同,所以很难进行比较。 Objective-C的消息传递系统是高度动态的,大多数决策都可以在运行时完成。C++的成员函数调用系统更为静态,并尽量在编译时执行

Objective-C的动态特性的一个优点是,您可以在运行时更改类系统,但这不一定与消息传递特性有关。例如,据我所知,mach中的消息传递系统并没有做到这一点


与消息传递性质直接相关的一个特性是,对象可以捕获它不理解的消息,然后将其转发给其他对象。这可以在mach中完成:消息的接收者可以在内核空间、用户空间,甚至在另一台机器中,而消息的发送者不需要关心它。这在设计内核时增加了更多的灵活性。(但此功能未在OS X的mach内核中使用。)

Objective-C消息传递未内置在内核中,而是内置在Objective-C运行时中

大部分魔术都是在一个名为
objc\u msgSend()
的函数中完成的。如果您编写这样的Objective-C代码:

[myObject doStuffWith:something];
编译器将实际生成与您键入的代码相同的代码:

objc_msgSend(myObject, @selector(doStuffWith:), something);
objc\u msgSend()
的实现非常快速和智能。通过缓存频繁使用的选择器实现快速,并且智能化,因为它允许尽可能晚地实现解决方案。实际上,
objc\u msgSend()
所做的是对选择器进行哈希查找,以找到实际的实现

您在这里拥有的一个优势是,如果找不到方法的实现,那么对象在运行时可以:

  • 推迟对另一个对象的调用以充当代理
  • 动态地操作选择器
  • 将实现动态绑定到以前未知的选择器
带有消息的动态类型语言最明显的优点是您在委托中看到的内容。例如,您可能已经注意到,
UITableViewDelegate
协议;并非所有方法都按要求声明


这允许符合(实现)协议的客户端通过根本不实现委托方法来推断默认行为。而在例如Java中,除了一个接口
Foo
之外,还有一个抽象的默认实现
FooAdapter
,它为接口中的每个方法实现默认实现。那么速度呢?如果大部分工作在编译时在C++中完成,那意味着它会更期待和更快。我说得对吗?(我在学习视频游戏编程,所以我真的很坚持速度)@gokoon:当然,是的。在C++中,调用方和被调用方之间有相当多的协调,这允许更重的优化。例如,在大多数调用中,精确调用方和被调用方都是已知的和固定的(不是通过函数指针)。如果在C++和Objto-C中实现完全相同的算法,C++将更快,但ObjtoVc的动态性允许您编写不能在C++中简单操作的操作,比如在运行时添加方法。这一特性在具有多种对象类型的GUI程序中非常方便。但是对于游戏编程,C++可能是一个更好的选择:在任何情况下,你都可以使用Open GL和C++程序,而开放的GL则可以跨平台轻松地移植。