Visual C++ 错误优化

问题描述 投票:0回答:3

我有双向链表: 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,则一切正常。

该怎么办? 预先感谢

c++ optimization visual-c++
3个回答
1
投票

如果你删除最后的

return
,它似乎可以工作,因为你已经引发了未定义的行为,并且编译器可以做任何它想做的事:在这种情况下,它随机返回true。

问题似乎不在这段代码中,但很可能您要存储的数据类型的

operator==
与列表中的预期项目不完全匹配。对于浮点或用户数据类型来说可能是这样。


0
投票

如果您使用GCC,您可以运行

g++ -fdump-tree-all
并获得大量(数百个)转储文件,其中包含GCC内部表示的文本演示,这样您就会了解正在发生哪些优化


0
投票

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

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

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

也就是说,对您的问题提出疑问:您不使用标准模板库列表是否有原因?

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

© www.soinside.com 2019 - 2024. All rights reserved.