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

いいえ。関数の静的は、関数が最初に呼び出されたときに評価されます。より早く評価する必要がある場合は、グローバルにする必要があります。1つの代替方法は、実際に関数が必要になる前に、プログラムの最初に関数を呼び出して、静的なものを評価することです。

于 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 に答える