2

C# の値の型を初めて見たとき、最初に思ったのは「なんて素晴らしい最適化だろう」ということでした。次に、「本当に新しい言語構造が必要なのだろうか?代わりに注釈を使ってそれを行うことはできないのだろうか?」ということでした。 "。

アイデアは、与えられたクラスをいつものように使用することです

class A {int i;}
class B {
    A m_a;
    int F(A a) {m_a = a;}
}

気まぐれに変わるA

[ValueType]
class A {int i;int j;}

そして、コンパイラは自動的にクラスBを次のように変換します

class B {
#region A
    int A_i;
    int A_j;
#endregion
int F(/*A param*/int i,int j) {
#region A_assign
    A_i = i;
    A_j = j;
#endregion
}

コンパイラがインスタンスを最適化したくない場合は、最適化する必要がないことに注意してください。どちらの方法でも機能します。

テンプレートで問題が発生する可能性があります。

int f<T>() {
    T t; // how much stack should I allocate
}

しかし、現在の状況よりもはるかに悪いかどうかはわかりません。私は実際に今何が起こっているのか分かりません(とf<struct_of_100_bytes>は別の機能f<int>ですか?)。

4

1 に答える 1

2

次に、継承を想像してください。または配列。または引数。あるいはジェネリック。またはインターフェイスを実装します。またはオブジェクト/ダイナミックに割り当てます。

また、ランタイムは複数のコンパイラをサポートしていることに注意してください。

属性ではなく特定のキーワード (構造体) を持つことは実際には大きな変化ではありません (実際、CLI に関してはすべてがクラスと呼ばれます) が、全体的な状況はあなたの例よりもはるかに複雑です。

基本的に、構造体はあなたが言及したほとんどすべてのことを行い、リストされているすべてのシナリオで機能します。一般的に(ローカルの場合)スタックを使用するため、すでに説明したように動作します。

「別の機能」の質問について。まず、ジェネリックは「テンプレート」ではありません(実行時とコンパイル時です)。ただし、ジェネリックは値の型ごとに JIT を取得し、参照の型ごとに 1 つの JIT を取得します (実際には、スタック レイアウトが変更されるためです。

于 2011-09-11T09:00:08.610 に答える