forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   FAQ (http://forum.boolean.name/forumdisplay.php?f=15)
-   -   Об использовании Goto (http://forum.boolean.name/showthread.php?t=26)

impersonalis 04.09.2005 22:08

Рано или поздно возникает вопрос об оправданности его использования. ГОТО - оператор безусловного перехода - порождение ассемблера (где он необходим), переполз вместе с некоторыми атавизмами в языки высокого уровня. Конечно, ваш знакомый кодер Вася скажет - "egal! не заморачивайся!". Но вот, что-то от известный программистов я таких откровений не слыхивал. Т.е. Вы, конечно можете возомнить себя Биллом Гейтсом и плодить, подобно ему, в своей программе ошибку на ошибке, раболепно покланяясь людской лени и предрассудкам.
Я лишь приведу простенькие примеры, которые наглядно покажут, что, юзая ГОТО Вы не просто, поступаете необуманно - Вы отстраняете себя от понимания логики программы.

impersonalis 04.09.2005 22:09

#1
Код:

#include<iostream.h>
#include<conio.h>
#include<string.h>
void main()
{
        char t[100];
f:
        cin>>t;
        if( stricmp(t,"")==0) {goto f;}


}

простейший код на С++ - вроде всё красиво и просто, далее...
(кстати, спросите тем времен у Васи - писал ли он, что-нибудь сложнее, чем пример №1)

#2
Код:

#include<iostream.h>
#include<conio.h>
#include<string.h>
void main()
{
        int a=1;
        int b=2;
        bool key=1;
        if(key==1){goto f;}
 int x=a;
 a=b;
 b=x;
        f:
 cout<<a<<" "<<b;
}

Данный пример чуть по-сложнее. Если флаг key не равен 1 - поменять значения переменных a и b местами.
И как Вы думаете: что скажет нам MSVC++?
Цитата:

error C2362: initialization of 'x' is skipped by 'goto f'
see declaration of 'x'
Error executing cl.exe.
1 error(s)

Т.е. временную переменную X необходимо закинуть повыше - до вызова оператора ГоТо. Теперь становится понятно, откуда у Васи Pascal`евские замашки инициализировать всё в одном месте.
Теперь представьте - такие танцы с временными переменными в большой программе...

Ещё, я обмолвился о понимании логики программы - так вот. Как описать процесс наполнения ведра водой "до краёв"?
Нормальный человек:
Цитата:

"Наливать, пока ведро не наполнится на 100%"
while get_p(vedro)!=100
dobavit_vodi(vedro)
wend

или
Цитата:

"Наливать пока не останется не занятого объёма"
while 100-get_p(vedro)>0
dobavit_vodi(vedro)
wend

ну или даже
Цитата:

"Наливать воду. Если ведро полное - прекратить"
while true
dobavit_vodi(vedro)
if get_p(vedro)==100 exit
wend

Логика с ГоТо:
Цитата:

"Налить воды. Если оно не полное то, повторить последнее действие"

Про многоступенчатые переходы, которые иначе как кошмарным сном не назовёшь, я вообще промолчу - представьте хотя бы, что каждому циклу Вы присваиваете уникальное имя. А блок-схема на готоах - это вообще абстракционизм.

Вчера ты был за goto,
сегодня - против функций
завтра - против массивов и типов
послезавтра - против мат.операций

SubZer0 04.09.2005 22:16

Сразу хочу сказать, я не прямотаки ЗА ГОТО, я против его противников, а теперь поехали!!!

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

2. цитата:
"Наливать воду. Если ведро полное - прекратить". Логика с ГоТо: "Налить воды. Если оно не полное то, повторить последнее действие"
Хотелось бы узнать, почему ты считаешь вторую логическую ситуацию хуже первой, неужели только потому, что такая логика конкретно тебе кажется нагляднее? с машинной точки зрения хоть первый случай, хоть второй будут обрабатываться одинаково...

3. то, что компиляторы глючно обрабатывают некоторые операторы, не значит, что сами операторы плохи...

4. коль уж вспомнили про ассемблер, давайте рассмотрим, что-же делает машина при вызове гото (в сравнении). (поскольку мы работаем в 32битном защищенном режиме, беру скоростя на дальние переходы, более 64 кб)

4а. оператор Jmp (гото который), заносит в регистр EIP новое значение тем самым провоцирует выполнение команды с другого адреса... работает за 3 такта на пентиуме 1 (для сравнения возьмем пент первый)

4б. оператор Call (Gosub который), заталкивает в стек текущий EIP и переходит по указанному адресу, при команде Return из стека достается это адрес и делается на него переход.. call работает за 4 такта, возврат 4 такта, итого восемь тактов первого пенька

4в. оператор Enter (вызов процедуры), создает стековый кадр нужного (заданного компилятором) раздела... помещает в новый стек адрес нормального стека и переходит по указанному адресу, при возврате восстанавливается адрес старого стека, удаляется новый, и делается переход назад таким образом сохраняются все переменные. дак вот команда входа выполдняется за 15 тактов, выход из процедуры три такта итого 18 тактов работы процессора

4г. циклы, в машинных кодах предусмотрены циклы с постусловием loop называются, дак вот, такой цикл уменьшает значение регистра ECX на один и если не ноль переходит на метку (там есть несколько условий в которых проверяется флаг равентства и флаг нуля, итого 4 условия). такая команда выполняется за 8 тактов если нужен переход и 7 тактов если переход не нужен...

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

5. напомню для тех, которые если определенные две строчки повторяются в коде делают сразу процедуру... для таких слчаев в НОРМАЛЬНЫХ языках программирования предусмотрены макроподстановки.

6. еще про возврат значений, хорошо если язык позволяет вернуть несколько значений из процедуры, а если нет?? делать глобальные переменные и присваивать значение в процедуре... а смысл тогда самой процедуры??

7. а путаница в переменных, когда не знаешь в каком месте программы какая переменная присутствует а какая нет и какое в ней значение если имя переменной юзается в разных процедурах для хранения разных значений...

8. я если чесно признаться всегда путаюсь, цикл с предусловием работает "пока не", а цикл с постусловием работает типа "если", дак вот я всегда путаюсь какое условие писать на не или просто... а при юзании гото, таких проблем нет, все ясно как день...

вообще мне кажется, это дело вкуса о котором как говорится не спорят.. :)

impersonalis 04.09.2005 22:17

5- такая штука на С++ называется in-line функцией (если я тебя правильно понял)
7- как раз про гото
8- вот именно, я знаю откуда ветер дует ;) переучиваться лень.
Ладно, проехали - но проблему освятить на форуме надо было :bravo:

alcosholik 05.09.2005 21:55

Согласен с предыдущим автором насчет восьмого пункта - дело привычки, просто попрактиковаться нужно.

Вообще goto сильно путает в больших проектах, где куча кода. Там метка может находится далеко от самого goto. В этом случае придется потратить время на поиск метки. С функциями же проще, так как всех их можно запихнуть в конец программы и в нужный момент сразу найти.

Я не считаю, что goto - это ламерство. Но со временем его смерть кажется неизбежной.

SubZer0 06.09.2005 01:06

Цитата:

Originally posted by alcoSHoLiK@Sep 5 2005, 07:55 PM
Я не считаю, что goto - это ламерство. Но со временем его смерть кажется неизбежной.
Както помнится Билли Гейтс говорил, что ассемблер в ближайшие годы должен умереть за ненадобностью... че-то не умерает он и врядли в ближайшие пару десятков лет умрет (пока нейрокомпы не изобретут)... и вместе с ним ГОТО будет еще дооолго жить и его будут юзать, и будут вестись споры о нужности его использования, и всегда эти споры будут приводить никчему... юзающие гото так и будут его юзать, а неюзающие и далее не будут позволять себе такое "ламерство"... :) :)

impersonalis 06.09.2005 18:53

Цитата:

Цитата:

Originally posted by alcoSHoLiK@Sep 5 2005, 07:55 PM
Я не считаю, что goto - это ламерство. Но со временем его смерть кажется неизбежной.
Както помнится Билли Гейтс говорил, что ассемблер в ближайшие годы должен умереть за ненадобностью... че-то не умерает он и врядли в ближайшие пару десятков лет умрет (пока нейрокомпы не изобретут)... и вместе с ним ГОТО будет еще дооолго жить и его будут юзать, и будут вестись споры о нужности его использования, и всегда эти споры будут приводить никчему... юзающие гото так и будут его юзать, а неюзающие и далее не будут позволять себе такое "ламерство"... :) :)

Про бессмысленность споров - это ты прав (заметка в FAQ - то не спор, а дискуссия, призванная объективно показать начинающим ту или иную проблему). Однако уверждать, что жив АСМ, это тоже самое, что и говорить о латыни, как о действующим языке - хотя официально он сичтается мёртвым. Всегда найдётся человек, знающий оправданность использования асма, да и латынь не от нефиг делать учат.
Иными словами термин "жив" здесь надо юзать весьма осторожно.

SubZer0 07.09.2005 00:07

Цитата:

Originally posted by impersonalis@Sep 6 2005, 04:53 PM
Иными словами термин "жив" здесь надо юзать весьма осторожно.
Я готов юзать это во весь голос и с гордостью :glag: , покажите мне человека который бы без существования асма запустил-бы комп! Это просто его сейчас не юзают в программировании...


а как-же вирусы?? их пишут кучами, если не взять макровирусы и всякие трояны начинающих на VB, то их пишут на чистом асме...

АСМ Жив и будет жить! :bravo:

alcosholik 07.09.2005 00:58

Цитата:

АСМ Жив и будет жить! :bravo:
Никто и не говорил "Смерть АСМу" :)

Велась дискуссия о целесообразности использования GoTo. ;)

jimon 07.09.2005 22:21

вы скажите разроботчкикам процесоров - смерть гото
они вам покажут "смерть"
asm и гото вечны ... потомучто обектное программирование прямо так встроить в процессор нельзя... как нестарайся :rolleyes:

а вот то что спорить об гото - глупо
важен результат а не как его добились

SubZer0 10.10.2005 06:36

Цитата:

Originally posted by jimon@Sep 7 2005, 08:21 PM
а вот то что спорить об гото - глупо
важен результат а не как его добились

это ты погорячился... если бы было не важно "как", то этот форум и не родился бы.. :) :rolleyes:

jimon 10.10.2005 19:03

обычный пользователь windows врятле думает как работает ядро и драйверная система

уже тем более он врятли знает как добится выхода в ring 0, как остановить ядро... как получать всякие там дельта-смещения и прочее

результат важен для конечных пользователей
coding_for_fun я не щитаю :o''

SubZer0 10.10.2005 20:21

Цитата:

Originally posted by jimon@Oct 10 2005, 05:03 PM
обычный пользователь windows врятле думает как работает ядро и драйверная система

уже тем более он врятли знает как добится выхода в ring 0, как остановить ядро... как получать всякие там дельта-смещения и прочее

результат важен для конечных пользователей
coding_for_fun я не щитаю :o''

и кстати не нужно путать ООП и программирование в Блице... я не вижу в блице ООП.

ага.. как пример если сравнить программирование с одеванием штанов, можно штаны разрезать, покусочкам к себе приложить и снова сшить, а можно просто одеть... теперь компы развились до такой степени что и первым способом и вторым можно будет одеть до 100 штанов в секунду, но все равно не нужно забывать в чем заключается искусство программирования... не в зарабатывании денег (не результат важен), а в грамотном коде(как его достигли)! :)

jimon 10.10.2005 22:18

:lol:

конешно сто штанов ето круто... да круто... штаны ето круто (как говорила масяня про печать :) )


При регистрации на форуме ты поставил галочку "Я согласен" под правилами форума. Там написано:
Цитата:

...
На форуме запрещено:
отправка сообщений не по содержанию форума/темы
...

Последнее предупреждение.

impersonalis 13.11.2005 03:42

Вот провёл тестик: что быстрее - цикл или переход по GoTo
Код:

ITER=1000000
;====
time1=MilliSecs()
i=ITER
.a
i=i-1
If i>0 Goto a
time1=MilliSecs()-time1
;===
time2=MilliSecs()
For i=ITER To 1 Step -1
Next
time2=MilliSecs()-time2
;===
Print "Goto "+time1
Print "for "+time2
WaitKey()
End

Интересно - попробуйте.

SubZer0 13.11.2005 03:48

у меня goto - 4, for - 6

PS я всегда говорил GOTO - Forever !!

impersonalis 13.11.2005 03:50

у меня:
goto - 350
for - 95
еcли вырубить debug
goto - 7
for - 4

PS: включённый Скайп, ВинАМП, Аська и скрипт Sign0fMissery

SubZer0 13.11.2005 03:59

вот еще всем кто говорит что функции рулят, пусть протестят вот этот код:

Код:

ITER=1000000
;====
time1=MilliSecs()
for i=1 to iter
 gosub subprogram
next
time1=MilliSecs()-time1
;===
time2=MilliSecs()
for i=1 to iter
 subprogram()
next
time2=MilliSecs()-time2
;===
time3=MilliSecs()
for i=1 to iter
 goto subprogram1
 .returnsubprogram
next
time3=MilliSecs()-time3

Print "GoTo  "+time3
Print "GoSub  "+time1
Print "Function "+time2
WaitKey()
End

.subprogram
 a=a+1
return

.subprogram1
goto returnsubprogram

function subprogram()
 a=a+1
end function

вот пример вызова функции, подпрограммы и простого перехода... протестите что быстрей! ;) :rolleyes: :rolleyes:

pax 13.11.2005 11:04

GoTo и GoSub рулят :super: ... вот тока в подпрограммы нельзя посылать параметры :unsure: как в функции и с возвратом какого-то значения тоже проблема будет (без допогнительных переменных не обойдешься).

jimon 13.11.2005 14:24

процедурки masm foreva


ps. вывод goto медленее for ТОЛЬКО ПОТОМУ ЧТО В GOTO СТОИТ IF!
вот доказательство
Код:

time2=MilliSecs()
While z=0
If x=ITER Then z=1
x=x+1
Wend
time2=MilliSecs()-time2
print time2

и почему в блице нельзя делать инлайн функций без рекурсии ? :)

alex-mad 13.11.2005 14:53

impersonalis, не обижайся и не ругайся :lol:
гото всётаки рулят :lol:

jimon 13.11.2005 15:00

а рулит потому что его щитает проц :)

impersonalis 13.11.2005 15:01

Цитата:

Originally posted by jimon@Nov 13 2005, 01:24 PM
процедурки masm foreva


ps. вывод goto медленее for ТОЛЬКО ПОТОМУ ЧТО В GOTO СТОИТ IF!
вот доказательство
Код:

time2=MilliSecs()
While z=0
If x=ITER Then z=1
x=x+1
Wend
time2=MilliSecs()-time2
print time2

и почему в блице нельзя делать инлайн функций без рекурсии ? :)

Да мне как-то пофиг насколько быстрее работает отдельностоящее ГоТо.
Именно что мне постоянно говорят: вместо лишнего цикла - я буду проходить по ГоТо с условием. Вот эти товарищи пусть утрутся.

И ещё: кто вам сказал, что компилятор blitz транслирует высокоуровневую команду goto в низкоуровневую команду goto. Ещё не факт, что в байт-коде оно будет выглядеть как ассемблерное ГоТо, а не набор из if-овов.
Мы же обсужаем использование ГоТо в языках высокого уровня, в частности- blitz3d
:P

impersonalis 13.11.2005 15:03

Цитата:

Originally posted by jimon@Nov 13 2005, 02:00 PM
а рулит потому что его щитает проц :)
Насыщенная реплика. А операции сложения, вычитания - наверно BIOS считает ;)

jimon 13.11.2005 15:05

я же неговорил про + и - :)

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

а вот гото в bmax 100 проценто рулит - так как транслируется в jmp :)

AsmLover 01.01.2006 23:32

Цитата:

Originally posted by impersonalis@Nov 13 2005, 02:42 AM
Вот провёл тестик: что быстрее - цикл или переход по GoTo
Код:

ITER=1000000
;====
time1=MilliSecs()
i=ITER
.a
i=i-1
If i>0 Goto a
time1=MilliSecs()-time1
;===
time2=MilliSecs()
For i=ITER To 1 Step -1
Next
time2=MilliSecs()-time2
;===
Print "Goto "+time1
Print "for "+time2
WaitKey()
End

Интересно - попробуйте.

Сравнение некорректное. Использование в цикле For...Next шага Step требует от компилятора дополнительного считывания из памяти переменной, эквивалентной Step. Да и число циклов нужно хотя бы на порядок увеличить.

Код:

ITER=10000000
;====
time1=MilliSecs()
i=1
.a
i=i+1
If i<ITER Goto a
time1=MilliSecs()-time1
;===
time2=MilliSecs()
For i=1 To ITER
Next
time2=MilliSecs()-time2
;===
Print "Goto "+time1
Print "for "+time2
WaitKey()
End

Teперь цикл с GOTO выполняется медленнее. (За счет того, что в итоговом ассемблерном коде в цикле For...Next используется константа и прямой инкремент регистра).

P.S. На ассемблере часто вместо прямого перехода jmp addr используется связка типа push .... ret.

Гораздо полезнее посмотреть, насколько медленнее происходит обращение к глобальным переменным, объявив ITER как GLOBAL.....

Guest 01.01.2006 23:47

GOTO в Блитце бывает полезна (очень редко) на коротких фрагментах программы. В одной из полных игровых программ, идущих в комплекте с полной версией Блитц3Д, она используется несколько раз и не ухудшает ни стиля, не читаемости программы. Другое дело, что современный принцип построения программм (в том числе и на ассемблере) - модульный, поэтому это GOTO и GOSUB может быть с трудом оправдано в пределах одного модуля, хотя любой алгоритм позволяет обойтись и без них.
Дополнительные потери времени при использовании функций, связанных с формированием кадра переменных на стеке и его использования, настолько несущественны, что не идут ни в какое сравнение с потерями времени на отладку и модификацию программы при отсутствии модульной структуры.
Разумеется, речь идет не о тесте на скорость, а о нормальной программе.
В таких программах использование GOTO и GOSUB означает только лишь некомпетентность программиста (я не имею в виду старые версии Бейсика, где просто не было полноценных функций).

SubZer0 07.01.2006 21:45

Цитата:

Originally posted by Guest@Jan 1 2006, 10:47 PM
В таких программах использование GOTO и GOSUB означает только лишь некомпетентность программиста (я не имею в виду старые версии Бейсика, где просто не было полноценных функций).
интересная у вас стратеги товарищ... ИМХО функции и прочую байду придумали для упрощения программирования, с этим я согласен, просто не надо думать, что:

1. функции работают с такой-же скоростью как и прямые переходы
2. тот кто юзает функции типа некомпетентен и в простонароде называется "ламер", по аналогии всех велосипедистов можно было опустить, ведь давно придуманы машины...


молодцы, что вы изучили функции, только вы от этого лучше не стали, могу сказать ооочень плохую черту функций, а именно восходящий стиль мышления когда из мелких функций складываются большие, потом еще больше и т.п... и то, когда дважды повторяющиеся две строчки в коде пихают в отдельную функцию это нормально да?...

могу короче представить много глюков с программированием функциями, примерно столько-же по программированию гото'м... здесь главное это алгоритмическое мышление, и реализовать один и тот-же алгоритм можно поразному...

НО единственная плохая черта в вас кодящих функциями, это то, что вы против тех кто кодит с участием ГоТо... а мы ГоТовцы нисколько не против вас...

:)

impersonalis 07.01.2006 22:20

Прирост от юзания ГоТо в прогах на б3д ( а имеено об этом здесь речь) - б.м. [как выражается alex-mad - "безумно малая величина"], а вот код сильно страдает.
Сдаётся мне, что все разговоры о, якобы, борьбе за скорость выполнения имеют под собой всего лишь не умение мыслиьт абстрактно ( лично, SubZero в виду не имею, т.к. достаточно хорошо знаю его адекватность и умственные способности ).
Хотя ГоТо в отдельных случаях (читай: консольный брутфорсер, написанный с 0 на асме) - это вещь :super: , но не здесь (читай: в офигительно разветвлённом алгоритме, описывающем сложные модели поведения перса и NPC).

jimon 07.01.2006 23:33

по оптимизации кода у меня есть неплохая вырезка из статьи "сравнение производительности КПК и настольных систем"
там человек обяснялся почему он неприменял оптимизацию к коду

Цитата:

Оптимизацию можно условно разделить на 3 вида:

1.Оптимизация машинного кода.

Дело в том, что одну и ту же программу, написанную на языке высокого уровня, в данном случае на С, перевести в машинный код можно множеством способов. Вот простой пример. Допустим нам нужно поместить в регистр AX - ноль. Это можно сделать следующими способами:
1)MOV AX, 0;
2)MOV AL, 0; MOV AH, 0;
3)XOR AX, AX;
4)XOR AL, AL; XOR AH, AH;
5)XOR AL, AL; MOV AH, AL;
6)PUSH 0; POP AX.

Один из этих способов окажется быстрее. Причем, какой именно, зависит от конкретного процессора. Одни процессоры лучше работают с длинными командами, другие с короткими и т.д. А если бы мы выбрали оптимизацию на минимальный размер, то возможно выбрался бы какой-нибудь другой способ. Естественно, в реальных приложениях все много сложнее, т.к скорость выполнения зависит и от окружающих команд. Так же очень сильно на скорость выполнения влияет порядок команд (ведь часто от смены порядка нескольких соседних команд суть кода не меняется).

2. Использование специфических особенностей процессора.

Это, прежде всего, расширенные наборы команд MMX, SSE1-3 и другие (конкуренты Intel тоже не отстают в командотворчестве). Эти команды хороши, но не всесильны. Область их эффективного применения довольно ограничена. Их суть ясна из их общего названия - SIMD (Single Instruction - Multiple Data/Одна инструкция - Много данных). Другими словами, они позволяют выполнить за одну команду какое-либо действие сразу же над несколькими числами. Это достигается за счет того, что данные наборы команд работают со специальными длинными регистрами, в которые можно поместить целый набор чисел - до 16-ти. MMX предназначен для обработки целых чисел и использует регистры сопроцессора (только 64 бита), в то время, как SSE работает с вещественными числами и использует собственные 128-битные регистры. SSE2, SSE3 развивают идеи заложенные в MMX и SSE. Таким образом, данные команды хорошо подходят для алгоритмов, которые выполняют простые, однотипные действия над большим объемом данных. Причем, эти алгоритмы должны иметь поменьше условных переходов, а вычисления можно было бы "распараллелить" (т.е для каждого последующего вычисления не нужно было бы знать результат предыдущего). В качестве примеров таких задач можно привести MPEG-декомпрессию, шифрование, преобразование цветового пространства, наложение текстуры, работу с комплексными числами, быстрое преобразование Фурье, дискретное косинус-преобразование, обсчет 3-х мерных сцен. Это весьма ресурсоемкие задачи, которые постоянно встречаются при работе с мультимедийными данными и играми. Поэтому понятно, почему инженеры Intel ввели в архитектуру процессора механизмы ускорения подобных задач - имеет смысл ускорять то, что выполняется дольше всего. Задачи из моего тестового приложения очень плохо подходят для данного вида оптимизации. В них сплошные условные переходы, размерности массивов задаются переменными, вычисления не распараллеливаются, используются тригонометричекие функции.

3.Оптимизация алгоритма.

Его суть заключается в замене одного алгоритма, другим, более быстрым (или более коротким, если выбрана оптимизация на размер), но который делает тоже самое. Тоже небольшой пример. Пусть есть программа:

int a = 1;

for (int i = 0; i < 3; i++) a += i*a;

она может быть оптимизирована, например, следующим образом:

int a = 1;

a+= 0*a;

a+= 1*a;

a+= 2*a;

очевидно второй вариант будет сильно быстрее (этот метод оптимизации называется "развертывание цикла"). А более умный компилятор может вообще заменить эту программку одной строчкой:

int a = 6

или вот еще пример:

int i, j, a = 0;

for (i = 0; i < 10; i++) {

for (j =0; j < 10; j++) {

a += (i*15 + j*20);

}

}

можно оптимизировать, например, так:

int i, j, k, a = 0;

for (i = 0; i < 10; i++) {

k = i*15;

for (j =0; j < 10; j++) {

a += (k + j*20);

}

}

в первом случае имеем 200 операций умножения, во втором всего 110. Соответственно второй вариант сильно быстрее. (Этот метод оптимизации называется "вынос константы из цикла").

Оптимизация алгоритма - потенциально самый эффективный, но сложно реализуемый способ. Тем не менее, компиляторы пишут не один десяток лет и те примеры оптимизаций, которые я привел и даже на порядки более сложные, вполне реальны для современных средств разработки.

ето слабо относится к теме,но - здесь более мение обясняется основные принципы оптимизации при прямой трансляции кода в asm
ето очень косается блицмакса

а вот в блице другое дело - тут код нетранслируется никуда :) он остается как был... только математические выражение упрощаются

тоесть нету смысла судить что выполняется быстрее :)
если бы вместе с кодом заново компилировалась библеотека runtime.dll то тогда бы на разных системах была заметная разница от использования разых методов, а так - пофигу :)

ссылка на статью : http://3dnews.ru/cpu/hpc-vs-pc/index02.htm...plate=print.htm


Часовой пояс GMT +4, время: 21:34.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Перевод: zCarot