0

C#(およびおそらくVB.NET)では、定数値配列を関数に渡す方法は3つあります。

byte[] buffer = {0};
someFunction(buffer);

byte[] buffer = new byte[] {0};
someFunction(buffer);

someFunction(new byte[] {0});

配列宣言子の単純な型キャストは無効な構文ですが、次のようになります。

someFunction((byte[]) {0});

質問:

CPU使用率、メモリ割り当て、および全体的なプログラムサイズの観点から、3つの作業方法のパフォーマンスの違いは何ですか?キーワードの使用はnew、特に宣言された変数が関数呼び出しの直後にスコープから外れる場合に、RAMの使用量または割り当てに影響を与えますか?

4

5 に答える 5

9

これらの有効なメソッドはすべて、まったく同じ方法で配列を渡します。配列を合法的に宣言して初期化する3つの方法と、その配列を別のメソッドに渡すたびに説明します。

someFunction((byte []){0});

単に有効な宣言構文ではありません。

于 2012-12-17T16:46:21.923 に答える
4
byte[] buffer = {0};

は単に構文上のショートカットです

byte[] buffer = new byte[] {0};

someFunction(new byte[] {0});

は単に構文上のショートカットです

byte[] some_tmp_variable_1 = new byte[] {0};
someFunction(some_tmp_variable_1);

したがって、他の人が結論付けているように、実際には配列をさまざまな方法でメソッドに渡しているわけではありません。<strong>常にまったく同じ操作を実行しています。3つのコードすべてが参照用にローカルスタックストレージを割り当て、3つすべてが参照用に割り当てられます。を介してヒープ割り当てを実行newし、指定された値で配列メモリを初期化します。最後に、すべてが値によってメソッドへの配列参照を渡します。

于 2012-12-17T16:50:20.003 に答える
3

最後の例に加えて、コンパイラは最初の3つの例すべてを同じコードに変更します。

于 2012-12-17T16:47:30.923 に答える
2

someFunction((byte[]) {0});単なる間違った構文であり、他のすべてはすべて同じです。ここでの違いは、buffer変数のスコープだけです。

オーバーヘッドはありません。

于 2012-12-17T16:47:13.797 に答える
1

最初の3つは、コンパイルするとまったく同じになります。

4番目のものは正しくありません。

于 2012-12-17T16:47:31.813 に答える