2013-07-01 4 views
5

Я хочу, чтобы число миллисекунд с эпохи. Популярное решение выглядит следующим образом (один из решений этого вопроса, заданные здесь Get time since epoch in milliseconds, preferably using C++11 chrono)C++ chrono duration_cast для миллисекунд результатов в секундах

#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++ как 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 

Update: это работает при использовании г ++ 4.8. Так что это ошибка gcc ?!

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

Работает хорошо здесь: http://coliru.stacked-crooked.com/view?id=58cbeec8ffe15b00c4c5617e5c661e44-95b421f505320e75ab053309436f3288 –

+0

@ R.MartinhoFernandes вы используете один и тот же г ++ и версии GLibC? – example

+0

Я отредактировал эту ссылку, чтобы включить вывод 'g ++ -v' (это 4.8.1). Это означает, что если это ошибка, это было исправлено. –

ответ

11

Я думаю, что это происходит, что вы компиляции с 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 используется во время выполнения.

+0

блестящий. до сих пор мне никогда не приходилось обращать на это внимание (вроде того, что надо быть честным) ... Я бы ожидал, что этого достаточно для нового номера версии (очевидно, что разные версии libc несовместимы!) но хорошо...спасибо за очистку для меня – example

+1

В своих конфигурациях по умолчанию библиотеки совместимы, один из ваших компиляторов должен был быть построен с '--enable-libstdcxx-time', который изменяет библиотеку ABI, и в этом случае ваша работа должна избегать смешивание несовместимых библиотек. –

 Смежные вопросы

  • Нет связанных вопросов^_^