2

CLI を介して動作する非常に基本的なバージョンのグラフ サーチャーがようやく完成しましたが、すべてのコードをリファクタリングする必要がある状況に陥っています。私はこのプログラミングを Mac で行っているので、GUI に Cocoa を使用し、その下に C++ 関数を主力として使用することを考えていました。最終的にはすべてのコードを Linux ボックス/クラスターで実行できるようにしたいので、これは一時的な修正にすぎません。 これが実装に関する私の最後の質問です。これはブーストで機能し、独自のグラフ関数をロールバックしました(今のところ)。

だからここに私の考えがありました:グラフ自体のC++クラスを構築し、計算したい量の関数またはメソッドを分離します。 これは、Objective-C と C++ の混合を扱う最新の説明です。しかし、私は疑問に思っていました:

Xcode での C++ コードのコンパイルは最適化されますか? 要点は、C++ コードを完全に最適化して、高速メモリ アクセス、複数スレッド、boost ライブラリへのアクセスを実現したいということです。次に、C++ クラスをラッピングする ObjectiveC クラスにカプセル化できます。これを行うには、基本的に2つのクラスが必要ですよね? .h および .cpp ファイルとインクルードされたブースト ライブラリを含む C++ クラス、次に .h および .mm ファイルを含む ObjC クラス ラッパー (.h には C++ クラスへの参照が含まれていません) .mm ファイル。次に、通常の MVC 設計と Objective C の GUI 実装を使用できます。dealloc コマンドに C++ クラスを無効にする機能を与える限り、メモリ管理について心配する必要はありませんか? ARC は C++ でもうまく機能しますか?

スレッド化が必要な場合は、ブーストスレッド化を使用すると思います.GCDのコーディングはプラットフォーム固有になるためです(ただし、今のところ、これが実行されるすべてです). テキスト ファイルを解析するだけでグラフを作成するので、今のところコア データには近づかないと思います。

4

3 に答える 3

5

Xcode での C++ コードのコンパイルは最適化されますか?

コードをコンパイルするのは Xcode ではなく、コンパイラ (GCC または clang) であり、適切なコンパイラ フラグを使用して要求すると、コードを最適化します。C++ と Objective-C を混在させると、どのようにコンパイラが最適化されなくなるのかわかりません...

dealloc コマンドに C++ クラスを nuke する機能を与えている限り、メモリ管理について心配する必要はありませんか?

具体的には?通常どおり、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)
  • ブーストスレッド
  • ポコスレッド

個人的にポコを使っています。

于 2013-02-28T06:51:38.047 に答える
1

Will compiling my C++ code in Xcode be optimized?

Yes.

To do this, I would essentially have 2 classes, correct? The C++ class with a .h and .cpp file and included boost libraries, and then the ObjC class wrapper with a .h and .mm file, where the .h does not contain any reference to the C++ class, I use the include in the .mm file.

Correct.

As long as I give the dealloc command the ability to nuke the C++ class, I don't have to worry about memory management?

Yes, your C++ objects' default constructor and destructor will be called at appropriate points in the ObjC object's lifetime when you declare a C++ ivar.

Like normal C++, you just use values or smart pointers rather than raw pointers for your C++ ivars and do little additional intervention with the object's lifetime. The compiler will not apply ObjC reference counting to your C++ types if ARC is enbled (after all, C++ objects are not strictly reference counted).

Does ARC work well with C++ as well, and does it give OSX the ability to memory manage and clean up my C++ code?

ARC only applies to ObjC types. It does nothing for C++ or even C types/allocations. Just use smart pointers or some appropriate C++ substitute (i.e. std::vector) for your C++ and C allocations/types. If you find yourself needing to write delete, delete[], or free often in C++, you are not using smart pointers correctly -- they are almost as simple as ARC, just offer more flexibility.

You may also want to look into CLANG_WARN_OBJCPP_ARC_ABI.

ARC is also different in that when a program is compiled as ObjC++, local strong ObjC references will be -released during unwinding from a thrown exception (not the case when compiled as ObjC+ARC).

于 2013-02-28T09:12:36.600 に答える