2013-03-15 18 views
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; 
} 

随着克++,其结果是:

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

这意味着,所述test()函数内的静常数这个函数的第一呼叫期间评价。除了声明作为全局变量外,是否有方法或技巧来强制在程序开始时对进行评估?

+1

为什么不在开始时调用函数?你可以传递一个标志,这样该函数就不会做任何事情。 – QuentinUK 2013-03-15 23:27:21

回答

2

否。函数第一次调用时,会计算函数中的静态值。如果你需要更快地评估它,它必须是一个全球性的。另一种方法是在程序开始时简单地调用函数,以便在实际需要函数之前对静态进行评估。

+0

他可以使用该函数初始化一个未使用的全局变量,强制它在main之前被调用。 – 2013-03-16 00:02:17

+0

@MooingDuck:这与使用全局开始没有太大区别。 – 2013-03-16 00:35:17

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; 

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