我有一个C函数,该函数接受字符串作为输入并解析为URI。
[此函数每次针对不变的正则表达式模式调用时都会调用regcomp
和regfree
:
#define URI_REGEX_STR \
"^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?"
int
LSUP_term_init(
LSUP_Term *term, LSUP_term_type type,
char *data, char *datatype, char *lang)
{
term->type = type;
if (data == NULL) return -1;
if (term->type == LSUP_TERM_URI) {
// TODO Move this to a code block that is only executed once.
regex_t ptn;
int status = regcomp(&ptn, URI_REGEX_STR, REG_EXTENDED);
assert(status == 0);
status = regexec(&ptn, data, 0, NULL, 0);
regfree(&ptn);
if (status != 0) {
printf("Error matching URI pattern.\n");
return(-1);
}
}
// [...]
return 0;
}
该函数被调用很多,而正则表达式的编译开销在运行时中占了很大一部分。
我的目标是:
ptn
编译一次到目前为止,我发现的唯一解决方案是创建一个“环境”结构,该结构将通过main
或使用该库的代码进行初始化和拆除。但是,这似乎很麻烦,因为我必须将“环境”指针传递给所有需要它的功能。
是否有更好的方法可以在C语言中实现?例如在退出时释放的全局变量? (我知道当程序终止时,它还是会被释放,但是我知道这是一种不好的做法,而且还会弄乱我的valgrind输出)。
谢谢。
标准C库提供了一个称为atexit()
的函数。您可以使用它来注册一个处理程序,以在程序结束时释放正则表达式。