У меня тут какой-нибудь 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
Здравствуйте, kan_izh, Вы писали:
_>У меня тут какой-нибудь UB и руки кривые или компилер лажает?
_>Этот код в debug выполняется как надо, выдаёт "ok", в release — "fail".
_>MSVS 2003, обычный консольный проект, созданный визардом.
ага, интересно.
при оптимизации /O1 либо без оной — /Od, результат "ok"
при /O2 либо /Ox результат — "fail".
так что наверное гон оптимизатора. хотя для полной уверенности надо глядеть сгенереный код. но вечером в тяпницу уж больно лень
Здравствуйте, 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".
unroller wrote:
> S>Это называется агресивная оптимизация. Вот еще более простой пример
> для MS VC 7.1.
> S>В дебаге дает "cdxx", а в релизе "cxxx".
>
> Исправили в SP1 для VS2003.
Только что SP1 поставил, мою проблему не исправили.
((
Перейти на gcc что-ли с горя?...
Posted via RSDN NNTP Server 2.0