gpt4 book ai didi

c++ - Visual Studio C++ 编译器优化破坏代码?

转载 作者:搜寻专家 更新时间:2023-10-30 23:49:44 25 4
gpt4 key购买 nike

我这里有一个特殊的问题,它在 VS2005 和 2010 中都会发生。我有一个 for 循环,其中调用了一个内联函数,本质上是这样的(C++,仅用于说明目的):

inline double f(int a)
{
if (a > 100)
{
// This is an error condition that shouldn't happen..
}

// Do something with a and return a double
}

然后在另一个函数中循环:

for (int i = 0; i < 11; ++i)
{
double b = f(i * 10);
}

现在发生的是在调试构建中一切正常。在启用了所有优化的发布版本中,根据反汇编,编译为 i没有 * 10 直接使用和比较a > 100变成 a > 9 ,而我猜它应该是 a > 10 .你有什么线索可以让编译器认为 a > 9是正确的方法吗?有趣的是,即使是周围代码中的微小更改(例如调试打印输出)也会使编译器使用 i * 10并将其与字面值 100 进行比较。

我知道这有点含糊,但如果有任何旧想法,我将不胜感激。

编辑:

这是一个有望重现的案例。我不认为它太大而不能粘贴在这里,所以这里是:

__forceinline int get(int i)
{
if (i > 600)
__asm int 3;

return i * 2;
}

int main()
{
for (int i = 0; i < 38; ++i)
{
int j = (i < 4) ? 0 : get(i * 16);
}

return 0;
}

我在我的机器上用 VS2010 对此进行了测试,它的表现似乎与我遇到问题的原始代码一样糟糕。我在发布配置中使用 IDE 的默认空 C++ 项目模板编译并运行了它。如您所见,永远不应击中中断点 (37 * 16 = 592)。请注意,删除 i < 4使这项工作,就像在原始代码中一样。

最佳答案

对于任何感兴趣的人,它原来是 VS 编译器中的一个错误。经 Microsoft 确认并在报告后修复在服务包中。

关于c++ - Visual Studio C++ 编译器优化破坏代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3724905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com