std :: cout выводит другой результат длительности хронографа под 32/64 бит - PullRequest
2 голосов
/ 13 апреля 2020

Я создал простой класс Timer, используя std::chrono

#include <chrono>
#include <iostream>
#include <thread>

class Timer
{
    std::chrono::steady_clock::time_point last;
    std::chrono::steady_clock::duration duration;
    bool started{};
public:
    Timer(bool start = false)
    {
        if (start)
        {
            last = std::chrono::steady_clock::now();
            started = true;
            std::cout<<"started\n";
        }
    }
    void pause()
    {
        if (started)
        {
            std::cout<<"paused\n";
            duration += (std::chrono::steady_clock::now() - last);
            started = false;
        }
    }
    friend std::ostream& operator<<(std::ostream& os, Timer const& t);
    ~Timer()
    {
        pause();
        std::cout << *this;
    }
};

int main()
{
    std::cerr << sizeof(size_t) << '\n'; //for indicating 32 or 64 bit
    Timer t{true};
    std::this_thread::sleep_for(std::chrono::seconds{ 1 });
}
std::ostream& operator<<(std::ostream& os, Timer const& t)
{
    os << std::chrono::duration_cast<std::chrono::microseconds>(t.duration).count() << " ms.\n";
    return os;
}

При использовании флага -m32 для компиляции 32 бит в G CC, это дает смешной результат: ссылка

4
started
paused
577755959817856 ms.

Но при компиляции в 64-битный результат кажется нормальным: ссылка

8
started
paused
1004260 ms.

РЕДАКТИРОВАТЬ: Да ms немного вводит в заблуждение здесь, должно быть µs, но мне лень найти µ

Ответы [ 2 ]

3 голосов
/ 13 апреля 2020

Я думаю, у вас просто UB в этой строке,

duration += (std::chrono::steady_clock::now() - last);

, потому что duration не инициализируется.

Если вы инициализируете duration член

std::chrono::steady_clock::duration duration{};

все отлично работает.

3 голосов
/ 13 апреля 2020

Проблема возникла из-за того, что вы не инициализировали duration, следовательно, UB.

См. https://godbolt.org/z/qTqLBC

...