我想要一个简单的字符串表来存储一堆常量,我想“嘿!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*指针。
但这不是很糟糕的编码吗?在我的c类中,它被钻到m中,以生成清晰定义的结构。我知道我可能在这里搅动了一个巢穴,但您真的会失去将结构定义为数据头而不是为该数据定义指针值的速度/空间吗?
最佳答案
其思想可能是将头和数据分配到一大块数据中,而不是分配到两大块数据中:
TString *str = (TString*)malloc(sizeof(TString) + <length_of_string>);
除了只调用一次malloc/free之外,还可以减少内存碎片并增加内存本地化。
但回答你的问题,是的,这种黑客通常是一种不好的做法,应该非常小心。如果你这样做了,你可能会想把它们隐藏在宏/内联函数层下。