【发布时间】:2014-06-06 01:05:06
【问题描述】:
我有一个需要一些常量数据的函数,但检索常量数据需要调用一个执行线性搜索的函数来检索数据。我不想为函数的每个调用执行搜索,所以我尝试制作有问题的变量static。但是静态变量不能初始化为非常量值:
int my_function(int foo)
{
static const Thing *bar = thing_from_name("bar");
return do_thing(foo, bar);
}
GCC 正确地抱怨“初始化元素不是常量”。
思考了一下自己的情况,我想出了一个吃蛋糕的方法:
int my_function(int foo)
{
static const Thing *bar = NULL;
if (!bar) bar = thing_from_name("bar");
return do_thing(foo, bar);
}
到目前为止,这似乎工作正常,但感觉......错了。这种方法有什么陷阱吗?有没有更好的方法来解决我的问题?
需要明确的是,thing_from_name 实际上是一个纯函数,因为它只从内存中的常量数据中读取。由于它会搜索字符串,因此我没有一种简单的方法可以将其优化为常量表达式(据我所知)。
编辑:这里是thing_from_name 所做工作的大致轮廓,以供进一步了解:
const Thing *thing_from_name(const char *name)
{
const Thing *t;
for (t = &thing_array[0]; t->name != NULL; t++) {
if (strcmp(t->name, name) == 0) {
return t;
}
}
return NULL;
}
【问题讨论】:
-
这就是为什么
constexpr是在C++11中发明的:) -
你是多线程的吗?
thing_from_name是直接还是间接分配内存?如果这些问题的答案是“否”,那么您提出的解决方案是完全有效的,而且实际上很常见。 -
你能提供'thing_from_name()'函数的伪代码吗?也许这有助于解释你的困境。
-
@MahonriMoriancumer,我在帖子中添加了它的功能大纲。
-
@user3386109,我认为我在技术上是多线程的,因为我使用的是 GTK,但是 IIRC 所有用户态代码都在一个线程中执行,除非你明确告诉 GTK 创建一个新线程(我不这样做' t)。