[英]Output Discrepancy using ctime and time_t
发现一个奇怪的差异,通过ctime输出time_t,同时弄乱了时间和持续时间。 我绝对肯定在这里错过了一些东西。 在代码和输出之后,有关于该问题的更多信息。 我在附近搜索了一个类似的问题,如果有,请直接引导我。
我当前正在运行:操作系统:Windows 7 64位CPU:英特尔酷睿i5 M 520 2.40Ghz RAM:4GB IDE:微软Visual Studio Express 2013
编辑:完整源
#include <iostream>
#include <chrono>
#include <ctime>
#include <thread>
using namespace std::chrono;
int main()
{
duration<int, std::milli> wait(5500);
time_point<system_clock> timePoint_Start;
time_point<system_clock> timePoint_End;
time_t timeT_Start;
time_t timeT_End;
std::cout << "01. timePoint_Start Address, sizeof: " << &timePoint_Start << ", " << sizeof(timePoint_Start) << std::endl;
std::cout << "02. timePoint_End Address, sizeof: " << &timePoint_End << ", " << sizeof(timePoint_End) << std::endl;
std::cout << "03. timeT_Start Address, sizeof: " << &timeT_Start << ", " << sizeof(timeT_Start) << std::endl;
std::cout << "04. timeT_End Address, sizeof: " << &timeT_End << ", " << sizeof(timeT_End) << std::endl;
timePoint_Start = system_clock::now(); // < = = = = set the time the 1st time
timeT_Start = system_clock::to_time_t(timePoint_Start);
std::cout << "05. Time Start: " << system_clock::to_time_t(timePoint_Start) << " " << std::ctime(&timeT_Start);
std::this_thread::sleep_for(wait);
timePoint_End = system_clock::now(); // < = = = = set the time the 2nd time
timeT_End = system_clock::to_time_t(timePoint_End);
std::cout << "06. Time End: " << system_clock::to_time_t(timePoint_End) << " " << std::ctime(&timeT_End);
duration<double> elapsed_seconds = timePoint_End - timePoint_Start;
std::cout << "07. Time Start: " << system_clock::to_time_t(timePoint_Start) << " 0x" << &timeT_Start << " " << std::ctime(&timeT_Start)
<< "08. Time Wait: duration<int, std::milli> wait(5500);" << std::endl
<< "09. Time End: " << system_clock::to_time_t(timePoint_End) << " 0x" << &timeT_End << " " << std::ctime(&timeT_End)
<< "10. Time Elapsed: " << elapsed_seconds.count() << "s" << std::endl;
std::cout << "11. Time End: " << system_clock::to_time_t(timePoint_End) << " 0x" << &timeT_End << " " << std::ctime(&timeT_End);
这是输出中出现差异的地方编辑:完整输出
01. timePoint_Start Address, sizeof: 0046FAA4, 8
02. timePoint_End Address, sizeof: 0046FA94, 8
03. timeT_Start Address, sizeof: 0046FA84, 8
04. timeT_End Address, sizeof: 0046FA74, 8
05. Time Start: 1402880407 Sun Jun 15 20:00:07 2014
06. Time End: 1402880413 Sun Jun 15 20:00:13 2014
07. Time Start: 1402880407 0x0046FA84 Sun Jun 15 20:00:07 2014
08. Time Wait: duration<int, std::milli> wait(1500);
09. Time End: 1402880413 0x0046FA74 Sun Jun 15 20:00:07 2014
10. Time Elapsed: 5.50932s
11. Time End: 1402880413 0x0046FA74 Sun Jun 15 20:00:13 2014
据我了解,输出的第6行,第9行和第11行应在时间戳上匹配。 输出的第9行似乎接收了错误的引用。 这里在语法上有问题吗?
我是一个菜鸟,但这似乎是很奇怪的行为。 如果我在错误的部分中,请将我定向到正确的部分。 真的很想知道这里发生了什么。
我相信std::ctime()
函数来自C标准,并且在C标准中,它返回指向静态内存位置的指针。 一次只能存储一个值。 由于您只有一次巨大的std::cout << ...
调用,该调用使用std::ctime()
3次,因此您不走运; 您将在所有三个位置显示一个值,而不是3个不同的值(通常,尽管具体情况取决于对ctime()
的调用与对<<
运算符的调用如何交错,具体取决于编译器),但显示的值不是三个。
证明这一点的最简单方法是修改代码,以使标记为7、8、9、10的行是单独的语句。
长期修复需要更多的思考。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.