2

我终于有了一个非常基本的图形搜索器版本,通过 CLI 工作,但我发现自己处于需要重构所有代码的位置。由于我在 Mac 上进行此编程,因此我正在考虑将 Cocoa 用于 GUI,然后将我的 C++ 函数作为主力。这只是一个临时修复,因为最终我希望能够在 linux 机器/集群上运行我的所有代码。 是我关于实现的最后一个问题,我确实得到了这个在 boost 中的工作,滚动我自己的图形函数(现在)。

所以这是我的想法:为图形本身构建 C++ 类,并为我想要计算的数量构建单独的函数或方法。 是我能找到的关于混合 Objective-C 和 C++ 的最新描述。但我想知道:

在 Xcode 中编译我的 C++ 代码会得到优化吗?重点是我希望 C++ 代码针对快速内存访问、多线程以及对 boost 库的访问进行全面优化。然后,我可以将 C++ 类封装在一个包装的 ObjectiveC 类中。要做到这一点,我基本上会有 2 个课程,对吗?带有 .h 和 .cpp 文件并包含 boost 库的 C++ 类,然后是带有 .h 和 .mm 文件的 ObjC 类包装器,其中 .h 不包含对 C++ 类的任何引用,我使用 include in .mm 文件。然后我可以为 Objective C 使用我正常的 MVC 设计和 GUI 实现。只要我让 dealloc 命令能够核对 C++ 类,我就不必担心内存管理?ARC 是否也适用于 C++,

我怀疑如果我想要线程,我会使用 boost 线程,因为为 GCD 编码会使其特定于平台(尽管目前,这就是它运行的全部)。我认为现在,我将远离核心数据,因为我通过简单地解析文本文件来创建我的图表。

4

3 回答 3

5

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

编译您的代码的不是 Xcode,而是编译器(GCC 或 clang),如果您使用适当的编译器标志请求它来优化您的代码,它会优化您的代码。我看不出混合 C++ 和 Objective-C 会如何使编译器无法优化......

只要我赋予dealloc命令核对C++类的能力,我就不用担心内存管理了?

具体来说?您仍然必须照常管理 C++ 和 Objective-C 对象的内存。

ARC 是否也适用于 C++?

不,它没有,它是一个 Objective-C 的特性。C++ 甚至没有引用计数(我希望它有......)。

于 2013-02-28T06:43:01.237 回答
1

我同意 H2CO3 所说的一切(除了关于引用计数的挑剔)。

还想指出 Daniel Sefton 写了一篇关于如何为 OSX 和 iOS 编译 Boost 的好文章:

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

穿线:

  • 如果您只想针对 OSX 和 iOS,C++11 具有原生线程支持,Android 尚不支持。

线程的其他选项是:

  • Posix 线程(又名 pthreads)
  • 提升线程
  • Poco 线程

我个人使用 Poco。

于 2013-02-28T06:51:38.047 回答
1

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

是的。

要做到这一点,我基本上会有 2 个课程,对吗?带有 .h 和 .cpp 文件并包含 boost 库的 C++ 类,然后是带有 .h 和 .mm 文件的 ObjC 类包装器,其中 .h 不包含对 C++ 类的任何引用,我使用 include in .mm 文件。

正确的。

只要我赋予dealloc命令核对C++类的能力,我就不用担心内存管理了?

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

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

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

ARC 仅适用于 ObjC 类型。它对 C++ 甚至 C 类型/分配没有任何作用。只需std::vector为您的 C++ 和 C 分配/类型使用智能指针或一些适当的 C++ 替代品(即)。如果您发现自己需要在 C++ 中编写deletedelete[]free,则说明您没有正确使用智能指针——它们几乎和 ARC 一样简单,只是提供了更大的灵活性。

您可能还想查看CLANG_WARN_OBJCPP_ARC_ABI.

ARC 的不同之处还在于,当程序编译为 ObjC++ 时,本地强 ObjC 引用将-release在从抛出的异常展开期间被 d(编译为 ObjC+ARC 时不是这种情况)。

于 2013-02-28T09:12:36.600 回答