5

私はObjective-Cを学習中です。そして、私はそのような「アカデミック」な質問を持っています。これは、現代のC ++(C ++ 11)に精通しているObjective-Cの専門家に向けられています。

C ++ 11では、移動セマンティクスをよく使用しました(一時オブジェクトへの参照を使用すると、不要なコピーを回避できます):
移動セマンティクスとは何ですか?
http://www.cprogramming.com/c++11/rvalue-references-and-move-semantics-in-c++11.html

移動セマンティクスの概念に精通していないObjective-Cコーダー向けのこれらのリンク、およびObjective-Cに類似したものがあるのか​​、これを実装/エミュレートする方法があるのでしょうか。

4

2 に答える 2

3

Objective-Cには似たようなものがありますか、それともこれを実装/エミュレートする方法がいくつかありますか?

いいえ。Objective-Cで作業している抽象化レイヤーを消化したら、これは大きな問題ではありません。オブジェクトは参照カウントされ、ヒープ割り当てであることを理解してください。

これを行うには2つの方法があります。

a)Objective-C++を使用する-言語機能をコンテンツに組み合わせるだけです。

b)慣用的なObjective-Cを使用します。これは長い間遡ります。オブジェクトが参照カウントされたヒープ割り当てであり、それを回避する方法がないことを受け入れたら(clangを使用)、プログラムに別の方法でアプローチする方法を学びます。確かに、すべてをカウントしてヒープに配置することにはコストがかかりますが、シナリオによってはこれらの特性を利用できます。最も注目すべき用途は、不変オブジェクトの使用と浅いコピーです。asオブジェクトをコピーするstd::stringと、SSOコピーまたはヒープ割り当てが発生します。をコピーするNSString単純に自分自身を返すことができます(参照カウントをインクリメントした後、文字列のタイプによっては、その時点で具体的なコピーを作成する必要がある場合もあります)。また、これらのオブジェクトはすべて単なるポインタであるため、オブジェクトの受け渡し方法(値/参照/定数参照/移動)を積極的に気にする必要はありません。ObjCにははるかに単純なモデルがあり、これを利用できます。したがって、ここでは設計に変化があります。ObjCでは「価値の優位性」が少なくなり、「不変性と共有を優先する」ことが多くなります。

場合によっては、moveメソッドを作成できます。一般的なフレームワーククラスはこれをサポートしていないため、通常、オブジェクトコンポジションを使用する方が理にかなっています。

オブジェクトはヒープに割り当てられるため、移動はそれほど重要ではありません。適切に設計されたクラスは、巨大で高価なコピーを最小限に抑えるためにコストを考慮し、内部的にいくつかの興味深い最適化を使用します。このイディオムは、クラスを作成するために別のアプローチを取る必要があることを示唆しているだけです。クラスはどのようにデータを共有するのでしょうか。可変とは何ですか?何をコピーする必要がありますか?場合によっては、大きくて可変/高価なデータを処理していて、移動が便利な場合もありますが、物理的なコピーを最小限に抑えるために(そして奇妙なことを避けるために、共有コンテナオブジェクトに配置するか、オブジェクトの初期化のセマンティクスを再検討することができます)。オブジェクトインターフェイスのセマンティクス)。それを超えて、純粋なObjective-Cでは動きがあまりにも頻繁に役立つとは思いません。もちろん、これらは、移動セマンティクスを利用するように設計され、複数のメモリ位置にオブジェクトを作成できるC++ライブラリにとって重要になります。移動する場合は、通常、その詳細を非公開にするか、実際に明確にする必要があります(たとえば、各フィルターへの大きな割り当てを最小限に抑えるために、レンダリングパイプラインでそれを実行しました)。

あなたがそれが有益であると思うところの例はまたあなたの問題/合理性を理解するのを助けるでしょう。

于 2012-11-06T22:53:35.467 に答える
3

Objective-Cは純粋なCに加えて特定の機能セットであるため、Objective-CにはCとは異なり、これらの機能はありません。Objective-C++には、C++に加えて同じ機能セットであるためにこれらの機能があります。

C ++で移動セマンティクスを非常に重要にするものの1つは、C++が値セマンティクスに重点を置いていることです。通常、C ++オブジェクトへのポインタは保持せず、値によってC++オブジェクトを保持します。移動セマンティクスがないと、これにより多くの不要なコピーが発生します。

Objective-Cは、値のセマンティクスに同じ重点を置いていないだけでなく、Objective-Cオブジェクトの値のセマンティクスを完全に禁止しています。Objective-Cオブジェクトは動的にしか作成できず、C構造体をコピーする方法でオブジェクトをコピーすることはできません。

@interface Foo
@end
@implementation Foo
@end

int main() {
    Foo f;
    Foo *a, *b;
    *a = *b;
}

error: interface type cannot be statically allocated
Foo f;
    ^
    *
error: cannot assign to class object ('Foo' invalid)
*a = *b;
   ^

したがって、参照と移動のC ++の概念はすべて、Objective-Cではポインターを使用してCの方法で実行されます。もちろん、これは、ポインターを回避する機能が同じであるため、C++にはCよりもObjective-Cよりも多くの同じパフォーマンス上の利点があることを意味します。

于 2012-11-06T23:03:44.460 に答える