2015-06-02 34 views
8

我正在使用C++ 98。函数调用可以在多大程度上被重新排序?我没有使用任何全局状态,只有函数本地的对象状态。函数调用可以重新排序

我的具体情况是:

{ 
    RaiiType T; 
    Object1.FunctionCall(); 
    Object2.FunctionCall(); 
} 

凡Object1和Object2的在未来的范围了声明。是否允许在任何函数调用后对T的构造函数进行重新排序,假设它可以被平凡地证明(至少对于人类而言)构造和函数调用之间没有依赖关系?


在我的特殊情况下,RAII对象用于定时执行函数调用。

+0

这取决于“没有依赖关系”。如果你的意思是无法观察到差异,那么是的,编译器(甚至CPU本身)可以自由地对操作进行重新排序。 –

+1

不重新排序,改变观察到的行为。但是如果你不能说出区别,那么编译器可以根据“如果规则”做任何事情。 – sp2danny

+0

你们其中一个人应该发布这个答案(最好是“好像规则”) – Creris

回答

6

只要符合标准的程序无法辨别其observable behavior中的差异,编译器(以及系统中的其他组件)就可以自由地重新排序指令和操作,只要它喜欢。

+0

换句话说,在“似乎规则”下(可能已被包括在内,只是为了使它更完整一些,但它是你的决定) – Creris

+0

是对' clock()'(或来自''的机制)根据规范认为“可观察行为”?查看问题的更新。 – Nemo

+0

@Nemo它不可能。如果是这样,没有优化是合法的,因为所有优化都可以改变时间代码运行的时间。你不能“综合”保证,显然这不能成为你的保证。 –