6

エポックからのミリ秒数が必要です。一般的な解決策は次のようになります (この質問の解決策の 1 つがここで尋ねられますGet time since epoch in milliseconds、できれば C++11 chrono を使用)

#include <iostream>
#include <chrono>

int main() {
    auto millitime = std::chrono::duration_cast<std::chrono::milliseconds>
        (std::chrono::system_clock::now().time_since_epoch()).count();
    std::cout << millitime << std::endl;
    return 0;
}

g++likeを呼び出してこれをコンパイルするとg++ -std=c++11 main.cpp -o timetest、出力が得られます

1372686001

エポックからの数に等しいです!

これは glibc のバグですか? g ++で?私の間違い?

g++ (Debian 4.7.3-4) 4.7.3
ldd (Debian EGLIBC 2.17-6) 2.17

更新: g++ 4.8 を使用すると機能します。それはgccのバグですか?

g++-4.8 (Debian 4.8.1-2) 4.8.1
4

1 に答える 1

12

GCC 4.7 でコンパイルしているのに、実行時リンカーがlibstdc++.so異なる GCC バージョンの を使用しており、std::chrono:system_clock. LD_LIBRARY_PATHまたは適切なリンカ オプションを使用して、GCC 4.7 でコンパイルし、それ使用することを確認したlibstdc++.so場合、結果は正しいはずです。

例えば:

$ $HOME/gcc/4.7.1/bin/g++ -std=c++11 t.cc
$ ./a.out
1372693222
$ LD_LIBRARY_PATH=$HOME/gcc/4.7.1/lib64 ./a.out
1372693225128

system_clock::now()への呼び出しがライブラリ内にあるために違いが発生するため、libstdc++.so実行時に使用されるライブラリによって結果が異なりますが、duration_castその値から への変換はmilliseconds、コンパイル時にインスタンス化されるインライン テンプレートによって行われます。コンパイル時の変換が実行時の呼び出しと一致しない場合、結果は一致しません。

GCC 4.8.1 では、利用可能な場合はシステム コールsystem_clockを常に使用するように実装が改善されましたがclock_gettime、4.7 ではそうではありませんでした。したがって、GCC がどのように構成されていても、一貫して高精度クロックを使用します。 4.8.1 の問題は見られません。

libstdc++.so実行時に正しいバージョンの が使用されていることを常に確認する必要があります。

于 2013-07-01T15:34:53.500 に答える