混合使用Objective-C和boost/C++

3
我终于通过CLI实现了一个非常基础的图形搜索器,但我发现自己需要重构所有代码。由于我在Mac上进行这个编程工作,所以想使用Cocoa作为GUI,然后在下面使用我的C++函数作为工作马。这只是一个临时解决方案,因为最终我想能够在Linux机/簇上运行我的所有代码。这里是关于实现的最后一个问题,我已经在boost中让它工作,并滚动了自己的图形函数(现在)。
所以,我的想法是:为图形本身建立C++类,并为我想要计算的数量分离函数或方法。这里是我能找到的最新描述,涉及混合Objective-C和C++。但我想知道:
在Xcode中编译我的C++代码会被优化吗?我想让C++代码完全优化以实现快速内存访问、多线程,并且可以访问boost库。然后,我可以将C++类封装在一个ObjectiveC类的包装器中。为此,我需要两个类,对吗?一个是带有.h和.cpp文件以及包含boost库的C++类,另一个是带有.h和.mm文件的ObjC类包装器,其中.h不包含任何对C++类的引用,我在.mm文件中使用include。然后我可以使用正常的MVC设计和Objective C的GUI实现。只要我给dealloc命令能够清除C++类,我就不必担心内存管理了,对吗?ARC也能很好地处理C++吗?它是否能够让OSX管理和清理我的C++代码?
我怀疑如果我想要多线程,我会选择boost线程,因为编写GCD代码会使其平台特定(虽然现在这是它唯一运行的平台)。我认为现在我会远离Core Data,因为我通过简单解析文本文件来创建我的图形。
3个回答

5
“在Xcode中编译我的C++代码,会被优化吗?” 并不是Xcode编译你的代码,而是编译器(GCC或clang),如果你使用适当的编译器标志请求它优化你的代码,那么它会进行优化。我不知道混合使用C++和Objective-C会使编译器不优化......
“只要我给dealloc命令提供清除C++类的功能,我就不必担心内存管理了吗?” 具体来说,你仍然需要像平常一样管理C++和Objective-C对象的内存。
“ARC也能很好地与C++一起使用吗?” 不可以,这是Objective-C的特性。 C++甚至没有引用计数(我希望有...)。

2
在Boost和C++11中,共享指针确实使用引用计数。但是这种方式与Objective-C完全不兼容。 - Jasper Blues
ARC 现在仍然可以在 C++ 中使用(当然,只能用于 ObjC 对象),而且它甚至更好了(现在您可以在结构体中拥有 ObjC 对象,而无需使用 __unsafe_unretained)。在 C++ 中内存管理是一个不同的故事,shared_ptr 是可以用来启用引用计数的东西(但性能可能会变差)。 - Bryan Chen
@JasperBlues 感谢你提醒,我之前不知道这个(不过这跟现在讨论的话题无关)。 - user529758
@xlc 没错,但我不确定 OP 是否认为 Objective-C++ 可以神奇地使 C++ 对象成为垃圾回收对象。 - user529758
C++实际上可以使用GC算法,最新规范中有一个完整的部分来处理它(即为其定义ABI..但据我所知,没有任何主要编译器实现它)。话虽如此,引用计数具有糟糕的性能特征,而更复杂的算法由于C++的本质而存在问题,如果它们起作用,就必须持悲观态度。 - Voo
好的,谢谢!我意识到优化是由编译器处理的,而不是IDE。因此,只要我像往常一样编写C++代码,我就可以使用.mm类包装器来访问C++对象,并自己处理内存需求。 - NuclearAlchemist

1

除了对引用计数的小挑剔外,我同意H2CO3所说的一切。

还想注意一下,Daniel Sefton 创建了一篇关于如何为OSX和iOS编译Boost库的不错文章

另外,是的,-dealloc是删除C++对象的好地方。

线程:

  • 如果你只想针对OSX和iOS进行开发,那么C++11具有本地线程支持,但这在Android上尚未得到支持。

其他线程选项包括:

  • Posix线程(又名pthread)
  • Boost线程
  • Poco线程

我个人使用Poco。


好的,这有很大帮助。我可以编写我的C++类,然后进行封装。另一个问题是如何在C++对象中进行I/O和多线程处理 - 我想我应该使用boost::thread库而不是尝试使用GDC。 I/O 在某个时候将不得不变得更加先进,因为我无法将所有图形都放入内存中,但这是以后的问题。 - NuclearAlchemist

1

在Xcode中编译我的C++代码会被优化吗?

是的。

为此,我需要两个类,对吗?一个带有.h和.cpp文件以及包含boost库的C++类,以及一个ObjC类包装器,其中.h不包含任何对C++类的引用,我在.mm文件中使用include。

正确。

只要我给dealloc命令能够摧毁C++类的能力,我就不必担心内存管理了吗?

是的,当您声明C++ ivar时,ObjC对象的生命周期中将在适当的时间调用C++对象的默认构造函数和析构函数。

像普通的C++一样,您只需为C++ ivar使用值或智能指针而不是原始指针,并且在对象的生命周期中进行少量的额外干预。如果启用了ARC(自动引用计数),编译器不会对您的C++类型应用ObjC引用计数(毕竟,C++对象并不严格按引用计数)。

ARC是否也适用于C++,并且是否使OSX能够管理和清理我的C++代码?

ARC仅适用于ObjC类型,对于C++甚至C类型/分配不起作用。只需使用智能指针或某些适当的C++替代品(例如std::vector)来处理您的C++和C分配/类型。如果您发现自己经常需要编写deletedelete[]free,则表示您没有正确使用智能指针-- 它们几乎与ARC一样简单,只是提供更多的灵活性。

您还可以查看CLANG_WARN_OBJCPP_ARC_ABI

ARC也不同之处在于,当程序编译为ObjC ++时,在从抛出异常解开绑定期间,本地强引用ObjC引用将被释放(在编译为ObjC+ARC时则不是这种情况)。


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