Мне нужна была простая таблица строк, которая будет хранить кучу констант, и я подумал "Эй! 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*.
Разве это не плохое кодирование? На занятиях по языку Си мне вдалбливали, что нужно создавать четко определенные структуры. Я понимаю, что могу разворошить гнездо, но действительно ли вы теряете так много скорости/пространства, определяя структуру как заголовок для данных, а не определяя значение указателя для этих данных?