WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  Предлагаю обсудить глюки VC6

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   Предлагаю обсудить глюки VC6
x опубликован 07-01-2002 13:28 MSK   Click Here to See the Profile for x   Click Here to Email x  
Сидел я тут ваял на вижуальнике
Бах = в пятый раз напоролся на старые грабли
в смысле на баги компилятора= все время о них забываю

Вот и решил написать сей текстовичок
может кому поможет избежать night debug sessions

Баг 1. компилятор не умеет сдвигать биты больше чем есть в источнике
точнее будет сказать что shr shl sal sar просто игнорируют старшие биты
(WORD)i<<17-не работает= точнее работает но неправильно= сдвигает на 1 бит влево
(DWORD)i<<32- аналогично= вообще не сдвигает
Баг 2.особо мерзкий и зловредный баг
(__int64) не сдвигает больше чем на 31 бит
(__int64)<<34 -будет еще хуже =см команды shld shrd
типичный пример
DWORD i,j,k
k=i*j/0x100000000; //эта злыдня оптимизирут деление на степень 2 как сдвиг
или
k=(i*j)>>32; //LOL

Баг 3. вот уж не знаю кого охаять MS или Intel
после особо премудрых оптимизаций
(__int64)j<<i может выглядеть как shld ecx,eax,cl
вы думаете это работает?
О да....разве что только GPF не генерит
в ecx после такого полный бред содержится
Баг 4. Не используйте знаковые типы
пример
LPSTRUCT lpstruct;
LPSTR lpstr="........."
DWORD i;

.......
lpstruct+(*(lpstr+i))

в чем баг?
да в том что char знаковый
мы имеем преобразование (char) to (DWORD)
movsx ax,[esi+i]
т.е если в строке символ 'я'=0xFF то в ax будет 0xFFFF

не не не это еще не все
дальше еще интереснее
пишем явное преобразование типов
lpstruct+(*((BYTE*)(lpstr+i)))

gy-gy-gy про себя хохочет компилятор
плевать он хотел на какие-то там лишние скобки
снова movsx ax,[esi+i]
Баг 5.
DWORD sim,size,i;
_asm{
mov eax,sim //ругается на SI
mov eax,size //ругается на SI
mov eax,i //нормально
}
Баг 6. не используйте модели вызовов без очистки стека
void Func(DWORD i)
{
while(i>0)
{
.....
i--;
}
}

ох и дрянной баг
в большинстве функций неудобно создавать зеркальные переменные-параметры
вроде DWORD _i=i;

проблема в том что в Debug версии С обычно использует STDCALL
или по крайней мере стек заполняет для каждого вызова заново
а в Release версиях прога сразу начинает глючить
Баг 7. это вообще из области маразмов
_asm{
movd eax,[esi]
}

ЭТО ГАДСТВО КОМПИЛИТСЯ!!!!!
но компилится как movd mm0,[esi]
Баг 8. чудеса оптимизации
for(..;..;..)
{
Foo(0);
Foo(0);
Foo(0);
}

в Release версии Foo(0) ВЫЗОВЕТСЯ ТОЛЬКО 1 РАЗ!!!
а может она где-то глобальные переменные мучает?

vitya опубликован 07-01-2002 16:58 MSK     Click Here to See the Profile for vitya  Click Here to Email vitya     
Наверное у тебя от что-то не так, у меня дает, как и следовало (WORD w = 5; w <<= 17;) w == 0.
Но у него с оптимизатором полно других
багов.
Например не раскручивает циклы,
в дебаг-е ++i быстрее чем i++ и еще много других мелких вещей.
Он расчитан уже на мощные машины, не то что старый борланд 3.1 (о чем я уже, вроде-как говорил).
DmitryRyvkin опубликован 08-01-2002 05:33 MSK     Click Here to See the Profile for DmitryRyvkin  Click Here to Email DmitryRyvkin     
А как насчет поставить Intel компилер ? Мне очень понравился. Оптимизация офигительная, жаль только компилит медленней
x опубликован 08-01-2002 13:51 MSK     Click Here to See the Profile for x  Click Here to Email x     
Интел идет на ***
он все оптимизирует на ОДИН сложный и 2 простых декодера

а у AMD даже в k6 их 2 сложных

короче я не хочу чтобы код примерялся к убогости рук интела

VuDZ опубликован 08-01-2002 14:03 MSK     Click Here to See the Profile for VuDZ    
2x
iCompiler генерит весьма неплохоц код _особенно_ для атлона - по крайней мере для мат. расчётов... я бы сказал офигенно быстрый код...

а если не нравиться скорость - асм тебе в руки и профайлер на шею - могу порекомендовать AMD codeanalyst - весч супер - показывает все глюки кода - отсутствие данных в кеше, конфликты, простои...

ЗЫ интеловский компилятор поддерживает более новую реализацию С++, чем от M$ - C99

x опубликован 08-01-2002 21:15 MSK     Click Here to See the Profile for x  Click Here to Email x     
CodeAnalyst довольно паршивая штука
на практике достаточно выровнять источник по границе строки и минимизировать число обращений в память=все остальное мелочи

а асмовые вставки я и так втыкаю через строчку=с тех пор как демки писал так и не отвык

а насчет быстрого мат кода=если оптимизировать то это MMX & SSE | 3DNow2
тут самый лучший компилер будет сакать раза в 4 по скорости а то и больше

eyes опубликован 09-01-2002 09:22 MSK     Click Here to See the Profile for eyes  Click Here to Email eyes     
Неохота на чужие грабли наступать. Тут в форуме такие прикольные топики проскакивают... кууулль!

х: т.е. и с 5-м сервиспаком все так же глючит?

зы. рашн демосцене рулез 4рева:) кинь ссылочку на демокодинг

DarkForce опубликован 09-01-2002 10:31 MSK     Click Here to See the Profile for DarkForce  Click Here to Email DarkForce     
Долго плакал утирая слезы рукавом. Спасибо X, давно так не смеялся.
x опубликован 10-01-2002 02:00 MSK     Click Here to See the Profile for x  Click Here to Email x     
2DarkForce > всегда пожалуйста =правда когда я эти баги находил мне сначала было не особенно весело>but it's my problem :)

2eyes>не совсем понял тебя

1линку на проекты в которых я участвовал?
2на действующие тусовки демомейкеров?
3просто на хорошие материалы по этому делу?

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.