函数内部的静态语句

时间:2018-11-10 20:12:17

标签: c++ static

为弄清我所说的静态语句的含义,类似于函数内部的静态变量,该语句只能在调用函数时执行一次,而不是每次调用函数时执行一次。

我知道这样做的三种方式,并且我想知道,如果存在任何不同的因素和其他因素,那么哪种方法在可读性和性能方面都更好。

第一个选项:

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中捕获数据,因为编译器告诉我,使用静态存储类捕获变量是错误的,这在一定程度上是合理的。

0 个答案:

没有答案