Показать сообщение отдельно
Старый 20.07.2006, 16:27
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 20  
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
ну поехали рассмотрим подробнее два кода с помощью flasm
первый
Код:
n = 5;
for (i = 0; i <= (n-1); i++) {}
и второй
Код:
n = 5;
for (i = 0; i < n; i++) {}
для первого получаем
Код:
	constants 'n', 'i'  	// сохраняем константы в пуле
	push 'n', 5		// кладем n и 5 в стек
	setVariable		// инициализация значение n = 5
	push 'i', 0.0		// кладем i и 0 в стек
	setVariable		// инициализация значение i = 0
label1:				// это начало цикла
	push 'i'		// кладем i в стек
	getVariable		// и берем ее значение
	push 'n'		// кладем в стек предельное значение, то есть 'n'...
	getVariable		// и берем ее значение, 5
	
	push 1			// кладем в стек 1
	subtract		// вычитаем, n-1
	greaterThan		// вычисляет булево выражение i>4
	not			// инвертируем и получаем i<=4
	not			// опять инвертируем и получаем i>4
	
	//// последние две строчки лишние явно
	
	branchIfTrue label2	// если у нас в стеке значение true, то идем к концу цикла на label2
	push 'i', 'i'		// дважды в стек помещаем i
	getVariable		// и берем ее значение i=i
	increment		// увеличиваем значение на 1, стеке i+1
	setVariable		// берем значение i
	branch label1		// переходим на начало цикла
label2:				//
а для второго
Код:
	constants 'n', 'i'  	// сохраняем константы в пуле
	push 'n', 5		// кладем n и 5 в стек
	setVariable		// инициализация значение n = 5
	push 'i', 0.0		// кладем i и 0 в стек
	setVariable		// инициализация значение i = 0
label1:				// это начало цикла
	push 'i'		// кладем i в стек
	getVariable		// и берем ее значение
	push 'n'		// кладем в стек предельное значение, то есть 'n'...
	getVariable		// и берем ее значение, 5
	
	lessThan		// вычисляет булево выражение i<5
	not			// инвертируем и получаем i>=5
	
	branchIfTrue label2	// если у нас в стеке значение true, то идем к концу цикла на label2
	push 'i', 'i'		// дважды в стек помещаем i
	getVariable		// и берем ее значение i=i
	increment		// увеличиваем значение на 1, стеке i+1
	setVariable		// берем значение i
	branch label1		// переходим на начало цикла
label2:
Белым я выделил различия. И как видно ни какой разницы кроме как удлинения числа выполняемых команд, типа вычитания и двойного отрицания нет. А если двойное отрицание убрать, сгенерить байт код и вставить за место обычного кода, то получим тоже самое что и с ними.
__________________
(и)Нильс.ru | Плагины для FlashDevelop


Последний раз редактировалось iNils; 20.07.2006 в 17:13.