繁体   English   中英

使用ctime和time_t的输出差异

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM