如何使编译器不优化getter的返回值并使其保持不变

时间:2012-10-13 13:59:30

标签: c++ visual-studio-2010 optimization return-value

我对C ++类有点问题...
我有一个私人会员bool clientConnected 和一个吸气剂bool isClientConnected() {return clientConnected;}

现在问题是.. clientConnected是从不同的线程设置的。

在主要我有一个循环

while (!x.isClientConnected())
{}

现在如果我在Debug config中编译它 一切正常......当clientConnected设置为true时立即退出 但如果我在Release配置中编译它。
编译器将循环优化为常量 并提出以下建议:

00141C01  cmp         al,bl  
00141C03  je          SDL_main+0A1h (141C01h)  

al的值永远不会再次更新 所以它总是认为它是假的 我也尝试了挥发性的,相同的结果

如何在课堂上阻止此优化,以便在每次调用时更新值,而无需编写类似

的内容
bool z = x.isClientConnected();
while (!z) { z = x.isClientConnected(); }

3 个答案:

答案 0 :(得分:4)

对于踩踏问题,您需要使用线程同步,以保证从一个线程到另一个线程的更改传播。

C ++ 11对线程有一些直接的支持,但我没有使用它。

如果您没有支持该编译器的编译器,请尝试使用Boost线程。

答案 1 :(得分:3)

volatile http://msdn.microsoft.com/en-us/library/12a04hfd(v=vs.80).aspx看起来像是对问题的简单回答:

  

“声明为volatile的对象不会在某些优化中使用,因为它们的值可能随时发生变化。”

volatile bool clientConnected;
bool isClientConnected() const volatile {return clientConnected;}

但是 - 你有循环CPU:

while (!x.isClientConnected())
{}

最好等待信号量:

x.waitForConnected();
void X::waitForConnected()
{
   WaitForSingleObject(m_connectedSemaphore, ,....);
}

如何在MS Windows中创建/使用信号量,请参阅:http://msdn.microsoft.com/en-us/library/windows/desktop/ms686946(v=vs.85).aspx

答案 2 :(得分:0)

您可以通过在源文件中移动方法的实现来欺骗编译器,并强制它不被内联(查找编译器的特定语法)。