长期 MSVC 用户,gcc 新手(请耐心等待)。
我在 Windows 7 上使用 rubenvb 版本的 c++(请参阅主题中的版本,是的,我正在为 64 位构建)并且我在使用 _BitScanForward64 时遇到问题。一些示例代码如下所示:
int __cdecl main(int argc, char* argv[])
{
DWORD d = (DWORD)atoi(argv[1]);
DWORD ix, ix2;
ix2 = _BitScanForward64(&ix, d);
printf("bsf %u %u\n", ix, ix2);
}
我正在编译:
"C:\Program Files\gcc2\mingw64\bin\c++.exe" -o iTot.exe -mno-ms-bitfields -march=native -momit-leaf-frame-pointer -mwin32 -Os -fomit-frame-pointer -m64 -msse4 -mpopcnt -D WINDOWS main.cpp
当我使用参数 8 运行 iTot.exe 时,我预计 _BitScanForward64 会将 ix 设置为 3。这就是 MSVC 所做的。但是,ix 为 0,而 ix2 为 1。
另外,查看汇编程序,我看到:
bsfq QWORD PTR 44[rsp],rax # MEM[(volatile LONG64 *)&ix], Mask
在这种情况下,为什么 gcc 在这里强制进行内存写入+读取?
所以,有几个问题:
- _BitScanForward64 是否应该在 gcc 下以不同的方式调用?如果我只是说错了,那会很高兴(尽管与 MSVC 不兼容会很痛苦)。
- 为什么 _BitScanForward64 内在强制内存写入?
盯着 -S 的汇编器输出,我看不出生成的代码有什么问题。但是,使用objdump.exe -d -Mintel,我发现它没有使用上面的 asm 代码(这似乎可以工作),它实际上产生了相反的结果:
bsf rax,QWORD PTR [rsp+0x2c]
怎么回事?为什么 -S 对我撒谎?
就像我说的,我是 gcc 的新手,所以如果我只是在做一些愚蠢的事情,请对我温柔一点。谢谢。