6

CのようにC#の安全でない構造体の中に子構造体へのポインターの配列を置くことができれば、ノードごとに1つのオブジェクトを持つというオーバーヘッドなしに複雑なデータ構造を構築する方がはるかに簡単で、時間の浪費も少なくなります。構文的にクリーンで、はるかに読みやすくなっています。

安全でない構造体内の固定配列が「値型」でのみ構成され、ポインターでは構成されないというアーキテクチャ上の深い理由はありますか?

構造体内に明示的に名前が付けられたポインターのみを使用することは、言語を弱めるための意図的な決定である必要があると思いますが、これがなぜそうなのか、または構造体内にポインター配列を許可しない理由についてのドキュメントは見つかりません。コレクターは、安全でないとマークされた構造体で何が起こっているかを気にする必要はありません。

Digital MarsのDは、構造体とポインターを比較してエレガントに処理します。簡潔データ構造を迅速に開発できないことを私は見逃しています。参照をC#で抽象化することにより、少なくともマーケティングの意味ではポインターがまだ存在しているにもかかわらず、言語から多くの力が取り除かれているように見えます。

複雑なデータ構造を時間の経過とともに効率的に表現する上で、言語がより強力になると期待するのは間違っているかもしれません。

4

3 に答える 3

4

非常に単純な理由の1つは、dotNETにコンパクトなガベージコレクターがあることです。それは物事を動かします。したがって、そのような配列を作成できたとしても、割り当てられたすべてのブロックを固定する必要があり、システムの速度が低下してクロールすることがわかります。

しかし、あなたは仮定に基づいて最適化しようとしています。dotNETでのオブジェクトの割り当てとクリーンアップは高度に最適化されています。したがって、最初に動作するプログラムを作成してから、プロファイラーを使用してボトルネックを見つけます。ほとんどの場合、オブジェクトの割り当てではありません。

編集して、後半の部分に答えます。

複雑なデータ構造を時間の経過とともに効率的に表現する上で、言語がより強力になると期待するのは間違っているかもしれません。

C#(または任意の管理言語)は、複雑なデータ構造を(効率的に)表現するのにはるかに強力だと思います。低レベルのポインタからガベージコレクションされた参照に変更する。

于 2010-05-03T09:42:11.187 に答える
2

推測しているだけですが、ターゲットプラットフォームごとに異なるポインタサイズが関係している可能性があります。C#コンパイラは、インデックスの計算に要素のサイズを直接使用しているようです(つまり、固定サイズのバッファインデックスを計算するためのCLRサポートはありません...)

とにかく、ulongsの配列を使用して、それにポインタをキャストできます。

unsafe struct s1
{
  public int a;
  public int b;
}

unsafe struct s
{
  public fixed ulong otherStruct[100];
}

unsafe void f() {
  var S = new s();
  var S1 = new s1();
  S.otherStruct[4] = (ulong)&S1;
  var S2 = (s1*)S.otherStruct[4];
}
于 2010-05-03T10:08:50.743 に答える
1

ポインタの固定配列を構造体に配置すると、すぐに構造体の候補としては不適切になります。構造体の推奨サイズ制限は16バイトであるため、x64システムでは、配列に2つのポインターしか収めることができず、これはまったく意味がありません。

複雑なデータ構造にはクラスを使用する必要があります。構造を使用すると、使用が非常に制限されます。たとえば、メソッドにデータ構造を作成して返すことはできません。これは、メソッドのスタックフレームに割り当てられたために存在しなくなった構造体へのポインタが含まれるためです。

于 2010-05-03T10:02:10.267 に答える