Я прошел несколько переписываний интерпретатора postscript, и хотя моя структура объектов начиналась точно так же, как ваша, я в итоге обнаружил, что этот макет «лучше» по причинам, которые я не могу сформулировать. Я нашел эту идею в структуре событий X11.
typedef struct {
word tag;
word pad;
dword padw;
} mark_;
typedef struct {
word tag;
word pad;
integer val;
} int_;
typedef struct {
word tag;
word pad;
real val;
} real_;
typedef struct {
word tag;
word sz;
word ent;
word off;
} comp_;
typedef union {
word tag;
mark_ mark_;
int_ int_;
real_ real_;
comp_ comp_;
} object;
Может показаться избыточным наличие тега как снаружи, так и внутри каждой структуры, но он хранит все в милых маленьких коробочках. Это позволяет видеть схему памяти более четко.
Редактировать: я называю это «тег» вместо «тип», потому что он содержит и t ype и fl ag s.
Редактировать: Одна из причин, по которой я считаю это лучше , заключается в том, что он исключает термин .u
из выражений доступа. Вместо stk.u.val
у вас есть stk.real_.val
или stk.int_.val
. Часть union смещена в восходящем направлении, поэтому части данных могут иметь внутреннюю структуру без дополнительного вложения. И tag
все еще доступен на верхнем уровне, чтобы определить, какой подтип используется.