У меня проблемы с пониманием поведения компилятора 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 (я должен), это единственная «странная вещь» в этом. Любая идея, любой намек?