Я читаю исходный код lua (5.3.0) и в lobject.h
я обнаружил, что он использует странный метод для управления строкой следующим образом:
/*
** Header for string value; string bytes follow the end of this structure
** (aligned according to 'UTString'; see next).
*/
typedef struct TString {
CommonHeader;
lu_byte extra; /* reserved words for short strings; "has hash" for longs */
unsigned int hash;
size_t len; /* number of characters in string */
struct TString *hnext; /* linked list for hash table */
} TString;
/*
** Ensures that address after this type is always fully aligned.
*/
typedef union UTString {
L_Umaxalign dummy; /* ensures maximum alignment for strings */
TString tsv;
}UTString;
/*
** Get the actual string (array of bytes) from a 'TString'.
** (Access to 'extra' ensures that value is really a 'TString'.)
*/
#define getaddrstr(ts) (cast(char *, (ts)) + sizeof(UTString))
#define getstr(ts) \
check_exp(sizeof((ts)->extra), cast(const char*, getaddrstr(ts)))
Я нашел хороший ответ о причине использования такого метода в там. Но меня интересует ensures maximum alignment for strings
, что это значит? зачем нам maximum alignment
и как обеспечить?
union
равно максимальному из выравниваний его компонентов.L_Umaxalign
, очевидно, имеет максимальное выравнивание, так как определяется какunion { double u; void *s; lua_Integer i; long l; }
- person Egor Skriptunoff   schedule 25.04.2015sizeof(TString) > sizeof(L_Umaxalign)
, так как же L_Umaxalign может обеспечить максимальное выравнивание строк? и почему толькоTString
этого не гарантирует? - person xuzhezhao   schedule 25.04.2015