visual c ++错误的优化

时间:2011-11-18 19:05:55

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

我有双重链表: 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;
}

方法没有根据debug调用。

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

怎么办? 提前谢谢

3 个答案:

答案 0 :(得分:1)

如果你删除最后的return 出现,那么你就会引发未定义的行为并且编译器可以做任何想做的事情:在这种情况下,它会返回true随机的机会。

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

答案 1 :(得分:0)

如果你使用GCC,你可以运行g++ -fdump-tree-all并获得很多(数百个)转储文件,其中包含GCC内部表示的文本表示,这样你就可以理解正在进行哪些优化

答案 2 :(得分:0)

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

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

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

那就是问你的问题:你有没有理由不使用Standard Template Library list

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