这个问题是this的后续问题,其中一致意见是the value of *this* pointer is not correct because of optimization
但not correct
的含义是什么?
我们如何调试优化代码?我们可以看到指针,对象布局,堆栈指针甚至是指令指针等等。例如,它意味着我们不能依赖这些值,因为它是一个优化的代码? 我们可以依靠什么而不是什么?
答案 0 :(得分:1)
IIRC,在VC ++中this
作为寄存器ECX
传递给函数,因此调试器只假设ECX
是 this
,只是抛弃了。这是this
与(CADOCommand*)ECX
相同。
在调试版本中,因为寄存器不会被重用,所以很好,但在版本构建ECX
中可以像其他任何寄存器一样重复使用。因此,调试器会丢失实际this
或其指向的任何内容。代码仍然是正确的,当然,只有调试器受到影响。
每次调用其他类的成员函数时,实际上必须覆盖ECX
。例如:
m_pCommand.CreateInstance(__uuidof(Command));
将编译为:
PUSH ECX ; push this into the stack
MOV ECX, &m_pCommand
PUSH __uuidof(command) ; a constant maybe?
CALL CCommand::CreateInstance
POP ECX ; restore this
请注意,如果编译器确定不再需要当前this
,那么它可能会省略PUSH/POP ECX
。