【问题标题】:visual c++ wrong optimisationvisual c++错误优化
【发布时间】:2011-11-18 19:05:55
【问题描述】:

我有双向链表: http://dl.dropbox.com/u/16185759/list.h

和其他类中的方法:

List<int> get_vertices()
{
    Element<Edge*> *curr = edges->head;
    List<int> vertices;
    int v1, v2;

    while (curr != 0)
    {
        v1 = curr->data->v1;
        v2 = curr->data->v2;

        if (vertices.has(v1) == false)
        {
            vertices.insert(v1);
        }

        if (vertices.has(v2) == false)
        {
            vertices.insert(v1);
        }

        curr = curr->next;
    }

    return vertices;
}

方法没有根据调试调用。

编译器忽略它,将值替换为 false,如果你在最后删除返回 false,那么一切正常。

怎么办? 提前谢谢

【问题讨论】:

  • head变量从何而来,是类方法吗?哦,对不起,我的错误=)
  • 也许你的head实际上是0...?
  • 欢迎来到 Stack Overflow。请发布完整的、最小的程序来重现您遇到的问题。告诉我们您得到什么输出以及您期望什么。
  • 听起来像是 UB 的案例,但在哪里...?
  • 你的data 绝对不是浮点数,是吗?

标签: c++ visual-c++ optimization compiler-construction


【解决方案1】:

如果你在最后删除return,它似乎可以工作,因为你已经引发了未定义的行为,编译器可以做任何它想做的事情:在这种情况下,它会随机返回 true .

问题似乎不在此代码中,但很可能您要存储的数据类型的 operator== 与列表中的预期项目不完全匹配。这可能适用于浮点或用户数据类型。

【讨论】:

  • 当前指针是Element类型,数据是同一种类型,那么数据是一种类型。
【解决方案2】:

如果您使用 GCC,您可以运行 g++ -fdump-tree-all 并获得大量(数百个)包含 GCC 内部表示的文本表示的转储文件,因此您将了解正在发生的优化

【讨论】:

  • 真的吗?从“获得大量(数百个)包含 GCC 内部表示的文本表示的转储文件”到“您会了解正在发生的优化”是否有暗示?对我来说似乎非常违反直觉......
  • 关键是要了解哪个转储文件是有趣的,这取决于涉及哪些优化。但我相信这些转储文件比仅仅查看生成的汇编代码更能说明优化的作用。
  • 这只有在您对 gcc 在内部做什么有一定的了解时才有帮助。这些文件通常用于帮助调试错误/非最佳代码的问题,因此目标受众并没有真正重叠。组装是通用的,在这种情况下会相当短,所以看起来更简单
【解决方案3】:

如果您使用的是 Visual C++,则默认情况下调试版本不会进行优化,因此这不太可能是优化错误。

我认为更可能的结果是调试符号未正确重新加载。您可以通过在函数中抛出一个硬错误来检查这一点,如果抛出错误,您就知道正在访问代码。

我建议使用printf 将调试输出打印到控制台,而不是仅仅依靠断点。

也就是说,对您的问题提出疑问:您是否有理由不使用Standard Template Library list

另外,我有点担心编译器甚至允许你有一个带有布尔返回的函数,没有定义的返回。您的编译器设置为什么警告级别? (我担心你或其他人降低了它,而你错过了关键警告)

【讨论】:

  • 我同意 Keeper 的观点,未能达到您“知道”正在执行的断点通常是符号问题。您也许应该尝试“全部重建”,看看它是否开始达到您的断点。如果它仍然没有达到断点,那么使用某种日志、跟踪或 printf 样式调试来找出发生了什么。
猜你喜欢
  • 1970-01-01
  • 2012-02-09
  • 1970-01-01
  • 1970-01-01
  • 2012-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多