Оптимайзер лажает? :(
От: kan_izh Великобритания  
Дата: 11.08.06 07:48
Оценка:
У меня тут какой-нибудь UB и руки кривые или компилер лажает?

#include "stdafx.h"
#include <iostream>
#include <string>

class CValue
{
public:
    CValue(bool boolean) : var(boolean){}
    bool get() const {return var;}
private:
    std::string str; // Если эту строчку убрать, всё заработает.
    bool var;
};

CValue check(const std::string &line1, const std::string &line2, const std::string &line3)
{
    return (
        (!(
            !line3.empty()
        ) || ( // =>
            !line2.empty()
        ))
        &&
        (!(
            !line2.empty()
        ) || ( // =>
            !line1.empty()
        ))
    );
}

int _tmain(int argc, _TCHAR* argv[])
{
    std::string line1, line2, line3;
    line2 = "zzz";
    std::cout << (check(line1, line2, line3).get() ? "fail" : "ok") << std::endl;
}

Этот код в debug выполняется как надо, выдаёт "ok", в release — "fail".
MSVS 2003, обычный консольный проект, созданный визардом.
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re: Оптимайзер лажает? :(
От: _Dreamer Россия  
Дата: 11.08.06 08:05
Оценка:
Здравствуйте, kan_izh, Вы писали:

_>У меня тут какой-нибудь UB и руки кривые или компилер лажает?

_>Этот код в debug выполняется как надо, выдаёт "ok", в release — "fail".
_>MSVS 2003, обычный консольный проект, созданный визардом.

ага, интересно.
при оптимизации /O1 либо без оной — /Od, результат "ok"
при /O2 либо /Ox результат — "fail".
так что наверное гон оптимизатора. хотя для полной уверенности надо глядеть сгенереный код. но вечером в тяпницу уж больно лень
Re: Оптимайзер лажает? :(
От: Smal Россия  
Дата: 11.08.06 16:30
Оценка:
Здравствуйте, kan_izh, Вы писали:

_>У меня тут какой-нибудь UB и руки кривые или компилер лажает?


_>MSVS 2003, обычный консольный проект, созданный визардом.


Это называется агресивная оптимизация. Вот еще более простой пример для MS VC 7.1.

#include<iostream>

int _tmain(int argc, _TCHAR* argv[])
{
   char c[4];
   c[0]='a';
   c[1]='b';
   c[2]='c';
   c[3]='d';

   std::cout << "before: " << c[0] << c[1] << c[2] << c[3] << std::endl;

   for( int n = 0; n != 2; ++n )
   {
      for( int i = 0; i < 3; ++i )
      {
         c[i] = c[ i + 1 ];
      }

      c[3] = 'x';
   }

   std::cout << "after: " << c[0] << c[1] << c[2] << c[3] << std::endl;

    return 0;
}


В дебаге дает "cdxx", а в релизе "cxxx".
С уважением, Александр
Re[2]: Оптимайзер лажает? :(
От: unroller Россия  
Дата: 23.08.06 10:51
Оценка:
Здравствуйте, Smal, Вы писали:


S>Это называется агресивная оптимизация. Вот еще более простой пример для MS VC 7.1.

S>В дебаге дает "cdxx", а в релизе "cxxx".

Исправили в SP1 для VS2003.
Re[3]: Оптимайзер лажает? :(
От: kan_izh Великобритания  
Дата: 23.08.06 11:12
Оценка:
unroller wrote:

> S>Это называется агресивная оптимизация. Вот еще более простой пример

> для MS VC 7.1.
> S>В дебаге дает "cdxx", а в релизе "cxxx".
>
> Исправили в SP1 для VS2003.
Только что SP1 поставил, мою проблему не исправили. ((
Перейти на gcc что-ли с горя?...
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.