我有一个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()
的函数。您可以使用它来注册处理程序,以便在程序结束时释放正则表达式。