Почему внутренние строки Lua хранятся так, как они хранятся?

Мне нужна была простая таблица строк, которая будет хранить кучу констант, и я подумал "Эй! Lua делает это, позвольте мне использовать некоторые из их функций!"

Это в основном в файлах lstring.h/lstring.c (я использую 5.2)

Сначала я покажу код, который мне интересен. Он из lobject.h

/*
** Header for string value; string bytes follow the end of this structure
*/
typedef union TString {
  L_Umaxalign dummy;  /* ensures maximum alignment for strings */
  struct {
    CommonHeader;
    lu_byte reserved;
    unsigned int hash;
    size_t len;  /* number of characters in string */
  } tsv;
} TString;


/* get the actual string (array of bytes) from a TString */
#define getstr(ts)  cast(const char *, (ts) + 1)

/* get the actual string (array of bytes) from a Lua value */
#define svalue(o)       getstr(rawtsvalue(o))

Как вы видите, данные хранятся вне структуры. Чтобы получить поток байтов, вы берете размер TString, прибавляете 1, и получаете указатель char*.

Разве это не плохое кодирование? На занятиях по языку Си мне вдалбливали, что нужно создавать четко определенные структуры. Я понимаю, что могу разворошить гнездо, но действительно ли вы теряете так много скорости/пространства, определяя структуру как заголовок для данных, а не определяя значение указателя для этих данных?

8
задан Paul Bruner 23 January 2012 в 23:13
поделиться