代数データ型(のADT)可能で再帰ユニット、積和型からなるタイプです。代数的データ型の好適なメモリレイアウトとは何ですか?
Haskellでは、簡単なADT考えてみましょう:どのようにHaskellの(ガベージコレクション)と錆(ガベージコレクションではないが)、実際にこれらを表しん
enum Message {
Quit,
ChangeColor(i32, i32, i32),
Move { x: i32, y: i32 },
Write(String),
}
:ルスト
data Tree = Empty
| Leaf Int
| Node Tree Tree
それとも別の例をメモリ、それらの表現方法は?
私は単純である非ごみ収集際に主に興味があるんだけど、解決策は、両方のヒープのために実行可能なことと、非ガベージコレクション場合スタック、錆のためのようにしなければなりません。
LLVMで表現、またはC/C++は、私が興味を持ってるものです
第二の例を使用して、私は2つのオプションを考えることができます。労働組合を使用して
オプション1:
enum MCtor { CQ, CCC, CM, CW };
struct Message {
enum MCtor ctor;
union {
void*; /* Quit */
struct { int r; int g; int b; } /* ChangeColor */
struct { int x; int y; } /* Move */
struct { char* str; } /* Write */
};
};
別割り当て、
void*
及び(ビット)を使用して
オプション2は、キャスト:
enum MCtor { CQ, CCC, CM, CW };
typedef struct { int r; int g; int b; } ChangeColor;
typedef struct { int x; int y; } Move;
typedef struct { char* str; } Write;
struct Message {
enum MCtor ctor;
void* data;
};
パターンマッチングは、単にその後、msg -> ctor
上switch
の問題です。特に再帰的な型を考慮すると、望ましい1
?
私の頭の上から離れて、私は最初のものの場所が良いと思いますし、負荷を避け、より多くのメモリを使用するかもしれないと思います...したがって、2番目のオプションはより良いメモリフットプリントを持っています。 ..?ここで
これはと思われます*あまりにも広い*として閉じられる。どの実装の詳細が最適かを尋ねていますが、あまりにも多くの変数があります。どんなマシンアーキテクチャーをターゲットにしていますか(キャッシュアライメントとパディングは確実に機能します)速度やメモリ使用量を最適化しようとしていますか?私はそれがどのような種類のものが保存されるかに依存することも期待します。あなたの言語のすべてがポインタとして表されていますか?錆*は*直接再帰的な型定義を許可しないことを – Shepmaster
注意。もしそうなら、構造体のサイズは無限になります。参照またはヒープ割り当てストレージ経由で間接参照のレイヤーを追加する必要があります。 – Shepmaster
言語C/C++はありません。 C++で匿名の 'struct' /' union'メンバーが使用できるかどうかは不明です。あなたの質問は、主に意見に基づいて広すぎる(1つ選ぶ)。 Anyは有効な終了理由です。 – Olaf