Visual C ++ неправильная оптимизация - PullRequest
0 голосов
/ 18 ноября 2011

У меня есть двусвязный список: 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, тогда все работает.

Что делать? заранее спасибо

Ответы [ 3 ]

1 голос
/ 18 ноября 2011

Если вы удалите return в конце, он будет работать , потому что вы вызвали неопределенное поведение, и компилятор может делать все, что ему захочется: в этом случае он возвращает значение true случайно.

Проблема не в этом коде, но, скорее всего, operator== для типа данных, который вы сохраняете, не совсем соответствует предполагаемому элементу в списке.Это может быть верно для типов данных с плавающей запятой или пользовательских.

0 голосов
/ 19 ноября 2011

Если вы используете Visual C ++, то по умолчанию отладочные сборки не будут иметь оптимизации, поэтому это вряд ли будет ошибкой оптимизации.

Я бы предположил, что более вероятным результатом будет то, что символы отладки не являютсяперезагружается правильно.Вы можете проверить это, вызвав серьезную ошибку в функции, и если ошибка выдается, вы ДЕЙСТВИТЕЛЬНО знаете, что код достигается.

Я бы предложил использовать printf для печати отладочных выходных данных.на консоль, а не полагаться только на точки останова.

Тем не менее, задайте вопрос на свой вопрос: есть ли причина, по которой вы не используете Стандартный список библиотек шаблонов ?

Кроме того, я несколько обеспокоен тем, что компилятор даже позволяет вам иметь функцию с возвращаемым значением bool без определенного возврата.На какой уровень предупреждения установлен ваш компилятор?(Я обеспокоен тем, что вы или кто-то другой понизили его, а вы пропускаете ключевые предупреждения)

0 голосов
/ 18 ноября 2011

Если вы использовали GCC , вы могли бы запустить g++ -fdump-tree-all и получить много (сотни) файлов дампа, содержащих текстовое представление внутренних представлений GCC, чтобы вы могли понять, какие оптимизации происходят

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...