Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Debug и Release Версии...в чем разница оптимизации?

489
29 мая 2008 года
NeO_u
277 / / 11.10.2006
Предварительно переменные:
 
Код:
BYTE commands[255];
for(j =0; j <= 4; j++)
{
  BYTE comm = commands[j];
  comm ^= 0xFF;

commands достаточно вот чего будет, для теста: 0xf9, 0xf9, 0xf9, 0xfe,
Вот есть код:
 
Код:
tmp = ( ( ( (comm>>(2*j)) << 1 )  & 0x02 )  |  ( (( comm>>(2*j) ) >> 1) & 0x01 ) );


И его вторая раздельная реализация:
Код:
BYTE tmp1;
       
tmp = comm>>(2*j);
tmp <<= 1;
tmp &= 0x02;
       
tmp1 =comm>>(2*j);
tmp1 >>= 1;
tmp1 &=0x01;
 
tmp |= tmp1;

И собственно конец цикла for
 
Код:
}


В Debug версии эти два кода работают одинаково, в Release, первая реализация работает не корректно.

ЗЫ: Среда: MS Visual C++ 6.0

У кого какие идеи будут на этот счет? Почему вдруг, оптимизация совершенно нерпавильная...?
6.6K
01 июня 2008 года
Scaiman
126 / / 25.07.2006
Собственно оптимизации в Debug вообще нет, а в Release проблемы могут быть из-за того что оптимизатор мог посчитать некоторые выражения бессмысленными, просто необходимо пересмотреть реализацию.
341
03 июня 2008 года
Der Meister
874 / / 21.12.2007
Для теста ты предлагаешь четыре значения, а в цикле обрабатываешь их пять. Может, дело в этом?
412
04 июня 2008 года
grgdvo
323 / / 04.07.2007
Расставь типы данных. Например параметр цикла j. По умолчанию это получается int, но для верности было бы разумено его поставить BYTE, чтобы избежать возможного каста при выполнении операторов >> и <<. Опять же у tmp тип не объявлен, по умолчанию int получаем. На несоответствие количества итераций цикла тебе уже указали.

После исправлений, мой вариант стал выглядеть вот так:
Код:
#include <windows.h>

int main(void)
{
    BYTE commands[4] = { 0xf9, 0xf9, 0xf9, 0xfe };
    for(BYTE j =0; j < 4; j++)
    {
        BYTE comm = commands[j];
        comm ^= 0xFF;
        // 1
        BYTE tmp = ( ( ( (comm>>(2*j)) << 1 )  & 0x02 )  |  ( (( comm>>(2*j) ) >> 1) & 0x01 ) );
        printf("%i",tmp);
        // 2
        tmp = comm>>(2*j);
        tmp <<= 1;
        tmp &= 0x02;
               
        BYTE tmp1 =comm>>(2*j);
        tmp1 >>= 1;
        tmp1 &=0x01;
         
        tmp |= tmp1;
        printf("%i",tmp);
    }
}


В результате в релизе получил вывод 11220000. Пример тестировал на vs2005
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог