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

Ваш аккаунт

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

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

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

Вопрос теоретикам C++

362
18 ноября 2005 года
_kolyan
339 / / 03.12.2002
Я-то все больше по-ламерски, методом научного тыка, а тут собрались большие знатоки стандартов и умных книжек (не будем показывать пальцем :D). Хочу наконец разобраться, какая конструкция работает быстрее и экономичнее:

 
Код:
void func1()
{
  if ( /*уcловие*/ )
  {
     // какие-то действия
  }
}



или

 
Код:
void func1()
{
  if ( ! /*уcловие*/ ) return;
  // какие-то действия
}
299
18 ноября 2005 года
3D Bob
885 / / 18.04.2005
Ты смеешься?
И первая и другая конструкция работает с одинаковой скоростью.
362
18 ноября 2005 года
_kolyan
339 / / 03.12.2002
Цитата:
Originally posted by 3D Bob
Ты смеешься?
И первая и другая конструкция работает с одинаковой скоростью.



Не смеюсь, соверешенное серьезно.

С одинаковой скоростью это предположение?

Например, обе конструкции имеют одну проверку условия, но вторая содержит две точки выхода из функции - одна по условию, а вторая в конце, как и у первой.

3
18 ноября 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by _kolyan
Например, обе конструкции имеют одну проверку условия, но вторая содержит две точки выхода из функции - одна по условию, а вторая в конце, как и у первой.


Твой вопрос не относится к языку программирования.
Это вопрос реализации компилятора и оптимизатора.

В общем случае можно считать, что приведенные примеры равнозначны.
Кроме того, я бы рекомендовал не заострять своё внимание на таких пустяках. Есть куда более (на порядки) более критичные места в любом коде.
К примеру, i++ и ++i.

Для оптимизации кода надо сначала делать его профилирование.

443
18 ноября 2005 года
REmindER
292 / / 23.03.2003
Нифига она не имеет две точки выхода на деле.
3
18 ноября 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by REmindER
Нифига она не имеет две точки выхода на деле.


Всё зависит от реализации компилятора.

443
18 ноября 2005 года
REmindER
292 / / 23.03.2003
ОК. Именно. А какой компилятор будет формировать две точки выхода?
443
18 ноября 2005 года
REmindER
292 / / 23.03.2003
А слышали о brainfucker'е?
362
18 ноября 2005 года
_kolyan
339 / / 03.12.2002
Цитата:
Originally posted by REmindER
Нифига она не имеет две точки выхода на деле.


Когда приводишь подобное высказывание, ты хоть поясняй откуда это следует. Ты говоришь - не имеет, я говорю - имеет и кто круче :)

Цитата:
Originally posted by Green
К примеру, i++ и ++i


Как ни странно, эту разницу я знаю и использую :D

Цитата:
Originally posted by Green
Всё зависит от реализации компилятора


Допустим Builder

Цитата:
Originally posted by REmindER
А слышали о brainfucker'е?


Это у тебя такой компилятор? :D

3
18 ноября 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by REmindER
ОК. Именно. А какой компилятор будет формировать две точки выхода?


Например компилятор из Visual Studio при включенной оптимизации.

443
18 ноября 2005 года
REmindER
292 / / 23.03.2003
Цитата:
Когда приводишь подобное высказывание, ты хоть поясняй откуда это следует. Ты говоришь - не имеет, я говорю - имеет и кто круче



Ну, как сказал Green, все зависит от компилятора. Хотелось бы узнать каким будет код с двумя точками выхода. Если не сложно, приведите.

Цитата:
Это у тебя такой компилятор?



Да нет. Представь себе, есть такой язык (или его подобие), состоящий всего из 8-и команд. Просто интересно и все.

3
18 ноября 2005 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by REmindER
Ну, как сказал Green, все зависит от компилятора. Хотелось бы узнать каким будет код с двумя точками выхода. Если не сложно, приведите.


Да пожалуйста:

Код:
int i=0;
int j=0;

void func()
{
     if (i == 0)
     {
         i = j;
         return;
     }  

    i = -1;
    return;
}

Дизассм:
Код:
void func()
{
     if (i == 0)
00401050  mov         eax,dword ptr ds:[00409620h]
00401055  test        eax,eax
00401057  jne         00401064
     {
         i = j;
00401059  mov         eax,dword ptr ds:[00409624h]
0040105E  mov         dword ptr ds:[00409620h],eax
    return;
}
00401063  ret              
         return;
     }  

    i = -1;
00401064  mov         dword ptr ds:[00409620h],0FFFFFFFFh
    return;
}
0040106E  ret
443
18 ноября 2005 года
REmindER
292 / / 23.03.2003
А в том первом случае скорость будет одинаковой? Я к тому, что можно так:

1.

 
Код:
void func1()
{
  if ( /*уcловие*/ )
  {
     // какие-то действия
  }
}


cmp ...,...
retne


...какие-то действия

2.

 
Код:
void func1()
{
  if ( ! /*уcловие*/ ) return;
  // какие-то действия
}


То же самое. А если код функции содержит какие-либо завершающие действия?
443
18 ноября 2005 года
REmindER
292 / / 23.03.2003
Цитата:
Originally posted by _kolyan
Допустим Builder


Вот, к примеру, C++Bulder 3:

Цитата:

 
Код:
if(a>b)
  {
  a=b;
  }


 
Код:
mov       eax,dword ptr [_a]
    cmp       eax,dword ptr [_b]
    jle       short @7
    mov       edx,dword ptr [_b]
    mov       dword ptr [_a],edx
@7:



Цитата:

 
Код:
if(a<=b) return;
a=b;

 
Код:
mov       eax,dword ptr [_a]
    cmp       eax,dword ptr [_b]
    jle       short @7
    mov       edx,dword ptr [_b]
    mov       dword ptr [_a],edx
@7:



Тут проявляется специфика построения кода функции. Вместо jle можно поставить retle, но переход необходим из-за завершающего кода. Этот пример вовсе не представляет типичную реализацию. Все зависит от компилятора и кода.

443
18 ноября 2005 года
REmindER
292 / / 23.03.2003
Цитата:
Originally posted by Green
Да пожалуйста:
Код:
int i=0;
int j=0;

void func()
{
     if (i == 0)
     {
         i = j;
         return;
     }  

    i = -1;
    return;
}

Дизассм:
Код:
void func()
{
     if (i == 0)
00401050  mov         eax,dword ptr ds:[00409620h]
00401055  test        eax,eax
00401057  jne         00401064
     {
         i = j;
00401059  mov         eax,dword ptr ds:[00409624h]
0040105E  mov         dword ptr ds:[00409620h],eax
    return;
}
00401063  ret              
         return;
     }  

    i = -1;
00401064  mov         dword ptr ds:[00409620h],0FFFFFFFFh
    return;
}
0040106E  ret



Не совсем это я имел в виду. В общем, не важно уже.

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