【发布时间】:2017-05-12 02:49:44
【问题描述】:
以下代码在调试模式下工作正常,因为定义了 _BitScanReverse64 如果未设置 Bit,则返回 0。 Citing MSDN: (返回值为)“如果设置了 Index,则为非零,如果未找到设置的位,则为 0。”
如果我在发布模式下编译此代码,它仍然可以工作,但如果我启用编译器
优化,例如 \O1 或 \O2 索引不为零,assert() 失败。
#include <iostream>
#include <cassert>
using namespace std;
int main()
{
unsigned long index = 0;
_BitScanReverse64(&index, 0x0ull);
cout << index << endl;
assert(index == 0);
return 0;
}
这是预期的行为吗?我正在使用 Visual Studio Community 2015,版本 14.0.25431.01 更新 3。(我留下了 cout,以便在优化期间不会删除变量索引)。还有一个有效的解决方法还是我不应该直接使用这个编译器?
【问题讨论】:
-
立即初始化索引在这里没有什么区别,因为_BitScanReverse 会进行初始化。
-
说“程序崩溃”是指
assert失败,对吧?我已经有一段时间没有使用 VS 了,但不应该在发布版本中禁用assert吗? -
微软在 _BitScanReverse64 上的页面并没有说如果没有设置位就会设置
index;它只说如果设置了一个位,index将设置一个值。因此,如果未设置任何位,_BitScanReverse64 可能会单独留下index,并保留它原来的任何内容。 -
@Altainia 有正确的答案。您应该检查
_BitScanReverse64的返回值。如果为零,则index的值未定义(至少在文档中)。假设是这样,因为只有一个非零返回表明index已设置。 -
index初始化为 0,但_BitScanReverse64可能会在内部更改它。如果没有找到 1,则未优化的版本可能会将index设置为零,但优化的版本会省略该部分以节省时间。两者都符合文档(“如果设置了索引,则为非零,如果未找到设置的位,则为 0。”)并且优化版本执行得更少,因此速度更快。
标签: c++ visual-studio optimization x86-64 intrinsics