私は、ある種の一般的な型交換された値で動作する従来の仮想マシンを設計しています。現在は、タグ付き共用体で表されています。
typedef struct val {
val_type type;
union {
int i;
unsigned int u;
double f;
str * str;
vec * vec;
map * map;
};
} val;
私はこれについてオンラインで多くの文献を見つけましたが、これは問題に対するかなり正統なアプローチであると結論付けています。ただし、次のようなアプローチでパフォーマンスを改善できるかどうか疑問に思っています。
typedef struct val_int {
val_type type;
int i;
};
typedef struct val_str {
val_type type;
char * buffer;
size_t length;
size_t capacity;
};
typedef struct val_vec {
val_type type;
val_type ** members; // <-- access member by cast
size_t length;
size_t capacity;
};
ここで、プリミティブ型にアクセスするための余分な間接化のコスト (および個々の割り当てを実行する必要がある - おそらくプーリングによって助けられる) と、のようなコレクションに保存されるメモリに対して保持されるコストとの間にトレードオフがあると推論していますval_vec
。それが表す現在ファット ポインターのサイズ。ここでの簡単な答えは「測定する」であることはわかっていますが、それ自体が完全な実装ではない、適切に代表的なモデルを思い付くのに苦労しています。
この 2 番目のアプローチの名前はありますか? また、これが慎重に管理されると仮定すると (ただし、未定義の動作が発生しないと仮定しないでください)、私が説明していない広く理解されているリスクはありますか? ここではどのアプローチが好ましいですか?
ちなみに、柔軟な配列メンバーの使用も同様に使用できますか?