Рассмотрим следующую программу: 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
в начале программы?
Нет. Статика в функции оценивается при первом вызове функции. Если вам нужно, чтобы он оценивался раньше, он должен стать глобальным. Одна альтернатива — просто вызвать функцию в начале программы, чтобы оценить статическое значение перед тем, как вам действительно понадобится функция.
Вы можете подделать функцию с классом, например, так:
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;
хотя это, вероятно, слишком много хака, чтобы его можно было использовать на практике.