したがって、C++では非常に簡単です。クラス/構造体をヒープに割り当てる場合は、newを使用します。スタックに配置したい場合は、newを使用しないでください。
C#では、常に新しいキーワードを使用します。これが構造体であるかクラスであるかに応じて、スタックまたはヒープのいずれかに割り当てられます(構造体はスタックに、クラスはヒープに割り当てられます)。一部のアプリケーションでは、それらのオブジェクトだけが実際にそこに属するヒープに移動するように設計を変更すると、パフォーマンスに大きな違いが生じます。
私が疑問に思うのは、オブジェクトが構造体として宣言されているかクラスとして宣言されているかに関係なく、オブジェクトが割り当てられる場所を直接制御する方法はありますか?値型(構造体)をボックス化してヒープに移動できることは知っています(ただし、ボックス化/ボックス化解除にはパフォーマンスが犠牲になります)。スタックにクラスを割り当てる方法はありますか?
また、生のメモリを割り当てて、C ++の新しい配置のようなものを使用するメカニズムはありますか?これは管理の考え方に反することは知っていますが、カスタムメモリ管理を使用できる場合は、パフォーマンスに大きな違いが生じる可能性があります。
ガベージコレクターなどの便利さからC#が大好きですが、アプリケーションのボトルネックに取り組むときは、実際に何が起こっているかをより細かく制御することが望ましい場合があります。
ヒント/ヒントは大歓迎です:)
編集:パフォーマンスの例:
struct Foo1
{
public int i;
public float f;
public double d;
}
struct Foo2
{
public Foo1[] bar;
public void Init(){
bar = new Foo1[100];
for (int i = 0; i < 100; i++)
bar[i] = new Foo1();
}
}
class Program
{
static void Main(string[] args)
{
DateTime time = DateTime.Now;
Foo2[] arr = new Foo2[1000000];
for (int i = 0; i < 1000000; i++)
{
arr[i] = new Foo2();
arr[i].Init();
}
Console.WriteLine((DateTime.Now - time).TotalMilliseconds);
}
}
これは私のマシンで実行するのに1.8秒かかります(実際には割り当てのみが行われていることに注意してください-パラメーターの受け渡しはありません)
Foo1が構造体からクラスに変更された場合、実行には8.9秒かかります。それは5倍遅いです