1

考虑以下程序: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

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

4

2 回答 2

2

不会。函数中的静态变量在第一次调用该函数时进行评估。如果您需要尽快对其进行评估,则必须将其设为全局。一种替代方法是在程序开始时简单地调用该函数,以便在您实际需要该函数之前对静态进行评估。

于 2013-03-15T23:30:59.103 回答
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;

尽管这可能在实践中无法使用。

于 2013-03-15T23:31:16.210 回答