成员变量在赋值后保存垃圾值

时间:2015-05-13 11:12:28

标签: c++ class debugging compiler-optimization

我遇到了一个奇怪的场景,我无法弄清楚它为什么会发生。

我有一个简单int成员的对象。

className.h文件:

private:
  int       m_variable;

public:
                   ...
(constructor and the rest of the functions)  
                   ...

className.cpp文件:

void className::function()
{
    ...
    m_variable = pointerToOtherClass->getMaxDistOfAllMatrices(); //first call
    int x = pointerToOtherClass->getMaxDistOfAllMatrices();     //second call
    m_variable = x;

    cout << m_variable  << "," << x;
}

第一个呼叫和第二个呼叫的功能是相同的,即将返回相同的值。

当我在第一个电话上放置断点并跳过电话时,我看到m_variable hols junk和x保持4(预期结果)。行m_variable = x;不会更改任何内容(x=4m_variable仍然保留垃圾),cout之后会打印4,4这是预期的。

first call行是代码第一次遇到m_variable

我不明白为什么会这样,我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

您正在看到优化工件。 将函数getMaxDistOfAllMatrices()第一个结果存储到变量m_variable中的操作被省略,因为稍后第一次调用函数的第二次调用的结果的两行再次存储到该变量x变量(通过x)。

cout保留预期值,因为它稍后会在m_variable = ponterToOtherClass->getMaxDistOfAllMatrices(); //first call 中使用。 请注意,调用的函数不会被省略(调用两次),因为它可能有副作用,但忽略第一个结果是有效的。

m_variable

踩到上方后,您可能会在int x = ponterToOtherClass->getMaxDistOfAllMatrices(); //second call m_variable = x; 看到垃圾。

var hull = SKSpriteNode(color: SKColor.grayColor(), size: CGSizeMake(64, 32))

var light1:SKSpriteNode = newLight()
light1.position = CGPointMake(-28, 6)
hull.addChild(light1)

var light2:SKSpriteNode = newLight()
light2.position = CGPointMake(28, 6)
hull.addChild(light2)

hull.physicsBody = SKPhysicsBody(rectangleOfSize: hull.size)
hull.physicsBody?.dynamic = false
hull.physicsBody?.affectedByGravity = false
hull.physicsBody?.allowsRotation = false

在超过两行后,您会看到两个变量中的预期值。