我遇到了一个奇怪的场景,我无法弄清楚它为什么会发生。
我有一个简单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=4
,m_variable
仍然保留垃圾),cout
之后会打印4,4
这是预期的。
first call
行是代码第一次遇到m_variable
。
我不明白为什么会这样,我在这里做错了什么?
答案 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
在超过两行后,您会看到两个变量中的预期值。