首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么NSRect、NSPoint等是结构,而不是类?

为什么NSRect、NSPoint等是结构,而不是类?
EN

Stack Overflow用户
提问于 2015-04-06 15:20:24
回答 7查看 1.8K关注 0票数 17

我最近需要创建我自己的类似于NSRect的类型,它有一个锚点(本质上是一个带有另一个NSPoint的NSRect )。

在使用some research之后,我发现实际上将其作为一个类(就像在NSObject子类中一样)可能比使用结构更好。那么为什么Apple要做这些类型的结构,而不是类呢?它似乎有很多好处,比如不必将它们包装在NSValues中,不必使用C函数与它们交互,等等。

我相信他们是有原因的。仅仅是内存使用量稍微少了一点?这只是历史吗?还是我错过了更重要的东西?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2015-04-06 15:54:19

每种编程范例都有其优缺点,面向对象编程( object-oriented programming,OOP)也不例外。

拥有类(即以面向对象的方式编写)的所有主要好处都是encapsulationpolymorphisminheritance

如果我们声明像Rect或Point这样的简单单元,我们将不会使用该列表中的任何东西,但我们将带来OOP的所有缺点,包括隐式可变、更复杂的内存管理、指针引用、隐式actors、断开的封装(使用setter/getter)等。我不会在这里列出OOP中确实存在的数百个anti-patterns

我怀疑为Cocoa中的Rect和Point选择结构是否有C遗留的合理性,首先是因为Objective-C从一开始就支持类,其次是因为全新的Swift语言没有这种遗留,但几乎所有的标准类型和容器都在其标准库中声明为结构,而不是类。

一般来说,如果你不需要封装、多态性和继承--你应该考虑将你的新实体声明为一个结构,并尽可能避免OOP。

票数 12
EN

Stack Overflow用户

发布于 2015-04-07 17:25:48

压倒一切的原因是性能--Cocoa的所有性能关键型API(图形、音频)都倾向于使用C结构和函数来实现这类目的。

原因是C编译器可以更容易地对它们进行优化。C函数的调用成本比方法更低,而且它们可以由编译器自动内联,从而完全消除了函数调用开销。C结构是在堆栈而不是堆上分配的,这意味着处理主要可以在寄存器或低级CPU缓存中完成,而不是调用主内存,后者要慢数百倍。

Cocoa方法是动态调度的。它们可能会被子类或swizzling覆盖,因此编译器不能内联它们,因为直到它们在运行时执行时,编译器才能确定它们将做什么。Cocoa类是在堆上分配的,所以它们必须被分配/释放,还有所有其他的开销,比如引用计数。它们也可能最终散布在内存中,这意味着由于它们所在的内存块必须分页进出缓存,因此可能会有显著的性能损失。

票数 8
EN

Stack Overflow用户

发布于 2015-04-07 00:45:49

还有一个优点是运算速度。这些点和矩形主要用来渲染一些东西,因此需要比以往更快的操作。而不是分配一个对象,这将触发递归init,花费大量字节和cpu周期进行卧底工作,它只是更快地说“这里我有16个字节,这是2个CGFloats of NSPoint结构”。当将工作委托给GPU时,这也是很有意义的,因为GPU对OOP和对象的方法一无所知,但需要在屏幕上绘制大量内容而不会出现故障。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29467071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档