0

を書いていMyClassCollectionます。の多くのインスタンスを格納する配列ですMyClass。配列は次のように宣言されMyClass[] myClassInstances;Add(MyClass ins)insますmyClassInstances

私の質問は次のとおりです。参照渡しする必要がありますか? パフォーマンスは向上しますか? そのコピーは本当に必要ありません。私はインスタンス化されたクラスを使用することを好みます (そうですか?)。それとも最適化への無駄な努力ですか(おそらくメモリのみですか?)。

これが私の現在のコードです:

class foo { }

class foocollection {
  private foo[] foo_instances;
  public @property foo[] data() { return foo_instances; }
  public void add(foo f) {
     ++foo_instances.length;
      foo_instances[$-1] = f;
  }
}
4

1 に答える 1

3

あなたが持っているものは、法的なコードでさえありません。配列をインクリメントすることはできません。に追加fするfoo_instances場合は、追加演算子を使用します。

foo_instances ~= f;

参照渡しに関しては、あなたが何を求めているのかよくわかりません。を参照渡ししようとしていますか? add?への引数 すなわち

public void add(foo f) {...}

public void add(ref foo f) {...}

ref無意味です。渡されたクラス参照を変更していないため、使用する理由はありませんref。それはただ混乱するでしょう。パフォーマンスへの影響を 100% 確実にするためにプロファイルを作成する必要がありますが、通過がより高速であるとしたら、私は非常に驚かれることでしょうref。クラスを関数に渡す場合、クラスはコピーされません。それらは参照型です。したがって、コピーされるのは参照であり、オブジェクトではありません。これは基本的にはポインターです (ただし、ポインターよりもわずかに多くなるように、いくつかの追加の型が含まれていると思います)。それらをコピーするのは安いです。クラスを関数に渡すコストについて心配する必要はありません。構造体を使用していた場合、構造体は通常値型であり、明示的にヒープに置かない限りスタック上にあるため、違いが生じる可能性がありますが、クラスの場合、それは問題ではありません.

いずれにせよ、パフォーマンスの問題がある場合、最も重要なことはコードをプロファイリングすることです。他のものよりも明らかに効率が高い、または低いものがあることは事実ですが、コンパイラが実際に何をするかを見るまでは確かなことはわからないことが多く、その結果はしばしば期待したものとは逆になることがあります。したがって、パフォーマンスについて知りたい場合は、コードをプロファイリングしてください。

于 2012-08-22T23:51:14.553 に答える