我无法理解 MS VC 编译器在这个上的行为。这条线编译得很好,但我得到的结果根本不是我所期望的:
this->Test((char *)&CS2 - (char *)&CS1 == sizeof(void *));
CS1 和 CS2 参数声明如下:
myFunction(tCS1* CS1, tCS2* CS2) {...
tCS1 和 tCS2 是分别包含一个 int 和一个 __int64 的结构。
这是为了检查我的参数 CS1 和 CS2 之间的堆栈距离,它们都是指针。当我在这一行中断执行并使用调试器获取我的两个变量的地址时,我发现它们确实相距 8 个字节(x64 平台)。
但是,比较的结果是错误的。
下面是编译器生成的汇编代码:
mov rax,qword ptr [CS1]
mov rdi,qword ptr [CS2]
sub rdi,rax
(然后它使用存储在 rdi 中的结果进行比较,并进行调用)
是的,编译器正在比较我的指针参数的值,而不是它们的地址。我在这里遗漏了一个间接级别,它去哪儿了?
当然,我无法在测试环境中重现这一点,而且我不知道该往哪里看。我正在将 32 位机器上的这段代码交叉编译到 x64 平台(我必须这样做),这是唯一“奇怪”的事情。任何想法,任何提示?