C++ C++;作用域变量重新排序和计时器

C++ C++;作用域变量重新排序和计时器,c++,C++,我对作用域_锁的工作原理感到非常困惑,我想知道是否可以在特定代码的执行时间上进行类似的实现 如果说我实现了一个简单的类作用域_计时器,它在构造时启动一个计时器,在删除时停止并报告经过的时间,那么这个示例代码的计时是否正确 func() { //some code { scoped_timer a; //some code that does not include a } //some code } 在实践中,我保证作用域\一个

我对作用域_锁的工作原理感到非常困惑,我想知道是否可以在特定代码的执行时间上进行类似的实现

如果说我实现了一个简单的类作用域_计时器,它在构造时启动一个计时器,在删除时停止并报告经过的时间,那么这个示例代码的计时是否正确

func()
{
    //some code
    {
       scoped_timer a;
       //some code that does not include a
     }
     //some code
 }
在实践中,我保证
作用域\一个
在开始时被构造,当它超出作用域时被销毁。编译器能否决定对代码进行重新排序,以避免在作用域结束时完全销毁代码或在开始时构造代码,因为它不依赖于
对象a
?C++标准是否有保证?< /P> 谢谢


Daniel

代码保证按照您的意愿运行

<>这个保证在C++中是重要的,因为C++不是A,因为C++中几乎任何函数都会有副作用(从当前线程的执行流程,或者从其他线程,甚至其他进程,数据是否被声明为代码>易失性< /代码>)。因此,语言规范保证了完整表达式的顺序

为了将这一点与C++11标准结合起来,有许多条款必须一起考虑

最重要的条款是§1.9:

§1.9程序执行[简介执行]

1本国际标准中的语义描述定义了 参数化非确定性抽象机器。这个国际 标准对一致性的结构没有要求 实现。特别是,它们不需要复制或模仿 抽象机器的结构。而是一致性实现 需要模拟(仅)抽象的可观察行为
机器如下所述。*(C++确实对本地对象调用构造函数和析构函数的确切时间做出了保证(它对全局对象的保证较少)。如果
作用域锁
获取得太晚或发布得太早,那将是非常糟糕的(如果
作用域锁
获取得太早或发布得太晚,那也将是非常糟糕的).重点(尽管回答得很好)如果需要一些特定的编程技术来确保
scoped\u lock
以所需的方式工作,这非常有趣……但是我还不清楚
scoped\u定时器a
是否会在作用域结束时被销毁,而不是在之后被销毁。@Daniel很好的一点。我已经添加了一个引用标准的附录,它保证了块级变量(包括问题中的对象
a
)将被销毁,并在其块退出时调用其析构函数。
compound-statement:

    { statement-seq }

statement-seq:

    statement

    statement-seq statement