强制在开始时评估函数内的静态常量?

时间:2013-03-15 23:22:26

标签: c++ function c++11 static operator-precedence

考虑以下计划:LWS

#include <iostream>
#include <chrono>

void test()
{
   static const std::chrono::high_resolution_clock::time_point marker 
   = std::chrono::high_resolution_clock::now();
   std::cout<<marker.time_since_epoch().count()<<std::endl;
}

int main(int argc, char* argv[])
{

    std::cout<<std::chrono::high_resolution_clock::now()
    .time_since_epoch().count()<<std::endl;
    std::cout<<"--------"<<std::endl;
    test();
    std::cout<<"--------"<<std::endl;
    test();
    return 0;
}

使用g ++,结果是:

1363389335665993
--------
1363389335666701
--------
1363389335666701

这意味着markertest()函数内的静态常量在第一次调用此函数时被计算。有没有办法或技巧(除非将marker声明为全局变量)在程序开始时强制评估marker

2 个答案:

答案 0 :(得分:2)

没有。第一次调用函数时,将计算函数中的静态。如果您需要更快地进行评估,则必须将其设为全局。另一种方法是在实际需要函数之前,简单地在程序开头调用函数,以便调用静态函数。

答案 1 :(得分:1)

你可以用这样的类伪造函数:

struct test_
{
    const std::chrono::high_resolution_clock::time_point marker; 

    test_()
      : marker( std::chrono::high_resolution_clock::now() )
    {}

    void operator()() const
    {
      std::cout<<marker.time_since_epoch().count()<<std::endl;
    }
} test;

虽然这可能是在实践中可以使用的太多黑客。