Оптимизация заставляет функцию немедленно возвращаться вместо выполнения - PullRequest
1 голос
/ 25 октября 2011

Я работаю над VS 2010 express и пытаюсь выполнить некоторые операции чтения и анализа файлов

моя функция работает примерно так ... (я отбросил скучные части)

void SomeClass::SomeFunc(char *ALName, std::map<...> *chromList, std::map<...> *chromLine)
{
    ifstream file;
    char tmpBuff[500];
    char tmpBuff2[500];
    char fileName[350];
    char tmp[350];
    char *pch;
    char *pch2;

    .....

    file.open(fileName);

    while ( file.getline( tmpBuff, 500 ) ) 
    {
        ....
        if ( some_condition == 0 )
        {
          pch2 = strtok( NULL, "," );
          pch = strtok( NULL, "," );
          (*chromList)[pch2] = do_some_work( atoi(pch), tmpBuff2 );
          strcpy( tmp, get_chrom_line( tmpBuff2 ) );
          (*chromLine)[pch2] = tmp;
        }
    }

    file.close();

 }

Когда я переключаюсь на Отпуск с оптимизацией, установленной на Максимальную скорость, эта функция пропускается.Отладчик входит в функцию и сразу же возвращается.

Когда я запускаю с параметром «Отладка» или «Выпуск» с отключенным флагом оптимизации, функция работает нормально.

Что может быть причиной этого?Могу ли я поместить определение препроцессора, чтобы принудительно вызвать «Нет оптимизации» для этой функции, в то время как остальная часть кода была оптимизирована

Спасибо!Идан

Ответы [ 2 ]

5 голосов
/ 25 октября 2011

Никогда не пытайтесь отлаживать оптимизированный код.Номера строк, которые он показывает, вы редко совпадете с тем, что на самом деле выполняется, и забудете о чтении локальных переменных.Вот почему есть режимы «Отладка» и «Выпуск».

Однако, если вы действительно хотите, попробуйте это , чтобы Visual Studio не оптимизировала эту функцию.Вы также можете поместить эту функцию в отдельный исходный файл и скомпилировать ее в режиме отладки.

4 голосов
/ 25 октября 2011

Вы уверены, что функция на самом деле пропускается и что отладчик не просто заставляет ее выглядеть пропущенной?

Если она действительно не выполняется, то почти наверняка произойдет неопределенное поведениеработать так, как вы хотите, когда он не оптимизирован, а компилятор (вероятно, по праву) оптимизирует его в нерабочий код в оптимизированном режиме.

При этом я вижу некоторые сомнительные элементы: Вы вызываете strtok с NULL(в сторону - предпочитайте 0 или nullptr в C ++ / C ++ 11), не вызывая его с допустимым указателем.Знаете ли вы, что strtok является разрушительным?

Затем вы используете символьный указатель для индексации массива или, предположительно (надеюсь?), Вызываете перегруженную operator[] функцию с аргументом char*.

Поскольку это C ++, ваш код будет чище, безопаснее и, вероятно, легче отлаживаться, если вы удалите весь синтаксический анализ в стиле C и сделаете это с помощью string и find / find_first_of / etc в зависимости от вашегонеобходимо.

...