Как Lua UTString обеспечивает максимальное выравнивание строк?

Я читаю исходный код 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 и как обеспечить?


person xuzhezhao    schedule 24.04.2015    source источник
comment
Выравнивание union равно максимальному из выравниваний его компонентов. L_Umaxalign, очевидно, имеет максимальное выравнивание, так как определяется как union { double u; void *s; lua_Integer i; long l; }   -  person Egor Skriptunoff    schedule 25.04.2015
comment
@EgorSkriptunoff Я думаю, sizeof(TString) > sizeof(L_Umaxalign), так как же L_Umaxalign может обеспечить максимальное выравнивание строк? и почему только TString этого не гарантирует?   -  person xuzhezhao    schedule 25.04.2015
comment
Вы путаете размер конструкции с ее выравниванием. Эти понятия очень разные.   -  person Egor Skriptunoff    schedule 25.04.2015