C++ 目标C中的消息系统是否依赖于内核消息系统?
我真的不明白ObjC如何有效地依赖消息。这是否意味着像mach这样的内核必须用这种想法设计 目标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
用语言构建的消息系统如何成为优势?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则可以跨平台轻松地移植。