为弄清我所说的静态语句的含义,类似于函数内部的静态变量,该语句只能在调用函数时执行一次,而不是每次调用函数时执行一次。
我知道这样做的三种方式,并且我想知道,如果存在任何不同的因素和其他因素,那么哪种方法在可读性和性能方面都更好。
void f()
{
static bool statement_done = false;
if ( !statement_done )
{
do_something();
statement_done = true;
}
}
此选项需要一个静态布尔值,然后再进行设置,我希望它以另一种方式进行设置,因为此后它很容易忘记将其设置为true,尽管它确实表示了do_something()的意图。显然,它只能执行一次
void f()
{
static int _anon0 = []()
{
do_something();
return 0;
}();
}
此选项使用匿名int,它的初始化是返回一个int的lambda,但在此之前也要调用do_something。
void f()
{
static int _anon0 = ([]{ do_something(); }(), 0);
}
这是滥用逗号运算符,我不确定在每种情况下都可以使用它,但是在Godbolt上,我已经看到它生成了在此示例中调用do_something()所需的程序集; < / p>
做这样的事情是否有更好的选择?如果没有,应该使用这三个中的哪个?
我问这个问题的动机是将数据存储在函数中供以后使用,因此不必每次都重新计算它,更具体地说是圆的绘制函数,我想存储所有正弦和余弦调用,因为它们非常昂贵,而且每次都总是一样,所以我做了这样的事情:
void Circle::draw()
{
static vector2 data[30];
static int a = [](vector2(&data)[30])
{
for (size_t n=0; n<30; n++)
{
data[n][0] = std::cos(2*pi * n / 30.0f);
data[n][1] = std::sin(2*pi * n / 30.0f);
}
return 0;
}(data);
draw(...); // Draws using data
}
我无法在lambda中捕获数据,因为编译器告诉我,使用静态存储类捕获变量是错误的,这在一定程度上是合理的。