发布于 2015-04-06 15:54:19
每种编程范例都有其优缺点,面向对象编程( object-oriented programming,OOP)也不例外。
拥有类(即以面向对象的方式编写)的所有主要好处都是encapsulation、polymorphism和inheritance。
如果我们声明像Rect或Point这样的简单单元,我们将不会使用该列表中的任何东西,但我们将带来OOP的所有缺点,包括隐式可变、更复杂的内存管理、指针引用、隐式actors、断开的封装(使用setter/getter)等。我不会在这里列出OOP中确实存在的数百个anti-patterns。
我怀疑为Cocoa中的Rect和Point选择结构是否有C遗留的合理性,首先是因为Objective-C从一开始就支持类,其次是因为全新的Swift语言没有这种遗留,但几乎所有的标准类型和容器都在其标准库中声明为结构,而不是类。
一般来说,如果你不需要封装、多态性和继承--你应该考虑将你的新实体声明为一个结构,并尽可能避免OOP。
发布于 2015-04-07 17:25:48
压倒一切的原因是性能--Cocoa的所有性能关键型API(图形、音频)都倾向于使用C结构和函数来实现这类目的。
原因是C编译器可以更容易地对它们进行优化。C函数的调用成本比方法更低,而且它们可以由编译器自动内联,从而完全消除了函数调用开销。C结构是在堆栈而不是堆上分配的,这意味着处理主要可以在寄存器或低级CPU缓存中完成,而不是调用主内存,后者要慢数百倍。
Cocoa方法是动态调度的。它们可能会被子类或swizzling覆盖,因此编译器不能内联它们,因为直到它们在运行时执行时,编译器才能确定它们将做什么。Cocoa类是在堆上分配的,所以它们必须被分配/释放,还有所有其他的开销,比如引用计数。它们也可能最终散布在内存中,这意味着由于它们所在的内存块必须分页进出缓存,因此可能会有显著的性能损失。
发布于 2015-04-07 00:45:49
还有一个优点是运算速度。这些点和矩形主要用来渲染一些东西,因此需要比以往更快的操作。而不是分配一个对象,这将触发递归init,花费大量字节和cpu周期进行卧底工作,它只是更快地说“这里我有16个字节,这是2个CGFloats of NSPoint结构”。当将工作委托给GPU时,这也是很有意义的,因为GPU对OOP和对象的方法一无所知,但需要在屏幕上绘制大量内容而不会出现故障。
https://stackoverflow.com/questions/29467071
复制相似问题