C++11 同时创建对象-不需要的编译器优化?

C++11 同时创建对象-不需要的编译器优化?,c++11,timestamp,compiler-optimization,chrono,g++4.8,C++11,Timestamp,Compiler Optimization,Chrono,G++4.8,我有一个奇怪的问题: for (size_t i=0; i<20; i++) { // pre is a vector<UserType> pre.push_back(UserType()); // In UserType constructor, record std::chrono::steady_clock::now() } std::chrono::stable\u clock::now()不保证任何特定分辨率。它只保证单调性。因此,连续调用可以同时返回。

我有一个奇怪的问题:

for (size_t i=0; i<20; i++)
{
   // pre is a vector<UserType>
   pre.push_back(UserType()); // In UserType constructor, record std::chrono::steady_clock::now()
}

std::chrono::stable\u clock::now()
不保证任何特定分辨率。它只保证单调性。因此,连续调用可以同时返回。事实上,为了满足单调性要求,可能会牺牲分辨率

如果你想要最高分辨率的时钟,你必须使用


std::chrono::staid\u clock::period
将使用a来告诉您以秒为单位的滴答声的长度。

我想我已经解决了问题:我将20个构造函数调用扩展到2000个,并开始观察构造过程中的不同时间戳。也就是说,在1纳秒内进行了几百次构造函数调用。这太棒了。

在20个构造中的每一个之前,我还尝试了std::This_thread::sleep_(std::chrono::millises(1000))——我仍然看到了相同的滴答数。真的不认为分辨率可以超过1秒。为什么你认为分辨率不能超过1秒?该标准没有这样的要求。1,从实用的角度讲,没有哪家编译器供应商会愚蠢到提供分辨率大于1秒的稳定时钟实现。在电子世界里,对人类来说,1秒就像一个世纪。我倾向于不使用高分辨率时钟,因为无法保证它是稳定的——这是一个实际问题。3.为了让生活更轻松,我刚试过高分辨率的时钟,它仍然给了我所有20种结构相同的滴答声。不过还是谢谢你的输入。我很确定这里的原因不是时钟。当我告诉你如何验证实际分辨率时,为什么要猜测你的想法呢?显示
UserType
的代码可能你没有正确使用
std::chrono::stable\u clock::now()
。@b4hand我是。我曾经在cygwin上的google测试中观察到奇怪的行为(在进行函数调用时指针设置为null)(这是一个完全不相关的情况),因此为了消除google测试问题,我还尝试将类移动到main.cc中,我观察到了同样的情况:gdb中的所有20个对象都有相同的勾号计数。这是一件奇怪的事。。。!“我不认为编译器能在一个稳定的时钟周期内完成20个对象构造。”---我的这个假设是荒谬的错误。而且,这种说法本身也是荒谬的错误。编译器生成汇编代码,链接器生成最终的二进制文件。二进制文件执行构造,而不是编译器。但是当我说“编译器”进行构造时,你就明白我的意思了。
class UserType
{
    public:
    UserType()
    {
        timePoint_ = std::chrono::steady_clock::now();
    }

    bool operator==(const UserType other) const
    {
        return timePoint_ == other.timePoint_;
    }

    friend std::ostream& operator<<(std::ostream& out, UserType type);

    protected:
    std::chrono::time_point<std::chrono::steady_clock> timePoint_;
};



std::ostream& operator<<(std::ostream& out, UserType type)
{
    out << type.timePoint_.time_since_epoch().count() << std::endl;
    return out;
}