可以编译器通过睡眠调用重新组织指令吗?

时间:2011-06-28 08:01:01

标签: c++ compiler-optimization

如果是第一次使用变量,是否存在差异。例如,a和b的处理方式不同吗?

void f(bool&a, bool& b)
{
    ...
    a=false;
    boost::this_thread::sleep...//1 sec sleep
    a=true;
    b=true;
    ...
}
编辑:人们问为什么我想知道这一点。 1.我想有一些方法告诉编译器不要在某些函数中优化(交换指令的执行顺序),使用原子和/或互斥量要比使用睡眠复杂得多(在我的情况下,睡觉)不是性能问题)。 就像我说的那样,知道这一点非常重要。

2 个答案:

答案 0 :(得分:1)

我们无法说出来。方案可能是编译器对调用站点的函数进行完全内省(并且可能内联它),在这种情况下,它可以与调用者混杂您的函数,然后适当地进行优化。

然后可以例如完全优化a和b,因为没有代码依赖于a和b。或者它可能会发现您违反别名规则,以便a和b引用同一个实体,然后根据您的程序流合并它们。

但也可能是你告诉编译器根本不进行优化,例如使用g ++的-O0标志,​​在这种情况下不会发生太多。

您的特定平台 * 的唯一证据可以通过查看生成的程序集,或告诉编译器请输出一些关于它优化的日志(g ++有很多标志)来制作)。


* 编译器+标志用于编译编译器+版本+附加组件,硬件,操作系统;如果你的编译器省略了一些优化,如果它需要很长时间甚至天气可能是相关的[这实际上是调试版本的很酷的功能,imho]

答案 1 :(得分:0)

它们不是本地的(因为它们是引用),所以它不能,因为它无法判断被调用函数是否看到它们并且必须假设它是这样。如果它们是局部变量,它可以,因为局部变量对被调用函数是不可见的,除非创建指针或对它们的引用。