Objective-C,.m / .mm 的性能差异?

32

我通常默认使用 .mm 扩展名创建新类,这样如果需要的话可以后续使用ObjC++.

这样做有什么缺点吗?什么情况下您会更喜欢使用 .m.m 编译出来的可执行文件是否更快(因为 C 通常比 C++ 快)?

2个回答

47
在Xcode 4.0之前(发布于2011年),可以使用Clang前端工具链来编译两种语言,使用.mm而不是.m对于“普通”的Objective-C来说主要的缺点是Objective-C++的编译时间显著较长。这是因为C++编译器比C编译器需要更长的时间。
更好的策略是默认使用.m。如果后来需要在开发中使用Objective-C++,将文件重命名为.mm扩展名是没有问题的。如果在Xcode中这样做,项目将自动更新以使用新命名的文件。
当然,在尝试比较Objective-C++与Objective-C的运行时性能时,所有标准警告都适用。由于Objective-C++是C++超集,而Objective-C是C超集,因此您正在处理两种具有运行时性能权衡的不同语言。鉴于您正在使用Objective-C,您很可能正在编写用户级应用程序(而不是系统级应用程序),C和C++之间的性能差异可能完全取决于您在每种语言中编写高效算法的能力。如果您是C++开发人员,则可能比C编写更好的代码,反之亦然。因此,始终使用适当的工具完成工作。
供参考,您可能还会对这个答案感兴趣:C vs C++(iPhone的Objective-C vs Objective-C++)

2012年2月17日更新 自Xcode 4.0(带有LLVM 3.0)起,Clang已支持Objective-C ++。即使是C ++11的支持现在也非常强大。


9
如果只使用C的功能,.mm文件应该生成与.m非常相似的代码。
将文件从.m重命名为.mm以后,如果您需要使用C++功能,不会有任何不利影响。

那么对于iPhone / Obj-C++开发,.m扩展名基本上已经被弃用了? - Sam
另外,如果体系结构得到支持,为什么GCC不会始终假定Obj-C++呢?从某些文件中取消C++代码的资格有什么好处? - Sam
9
“.m” 扩展名并没有被弃用,实际上它是默认的扩展名。假设使用 ObjC++ 是一个不好的想法,因为在某些情况下 C++ 和 C 是不同的(符号重载是最明显的区别,但还有很多其他的区别)。允许在 .c 文件中使用 C++ 同样是错误的——它们是两种不同的语言。 - rpetrich
Objective-C被用于与C的兼容性。.m是Obj-C文件的默认扩展名。正如提到的,这些东西的编译方式有一些不同。例如,C结构体被实现为类,其数据成员默认具有公共可见性,而不是在C中的原始实现。 - Andrew Noyes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接