M.A.X.    Вы вошли как гость
Российский Клуб игроков M.A.X.
 
[Новости]   [Новичку]   [Энциклопедия]   [Документы]   [Файлы]   [Игроки]   [Архивы]   [Архив форума]  
[Новый сайт]   [M.A.X. Gold]   [Партии]  

 
 
 
Архив форума  МаксГолд
[Основной форум] [Голосования] [МаксГолд] [Off-Topic]
 


Отв: Коменты  -  Artlav,  03.06.2010  19:55:41

##а ещё и отсутствие коментов
Это да. Каюсь, писать в коменты ничего не очевидного в голову не приходит.

##Я бы вообще предпочёл объекты
В объектах было бы тоже самое, только неявно.

##Отличие в том, что на один уровень меньше обращений.
Менее понятно, что есть что и к чему относится ценой мизерного прироста производительности?
Процессору одну двойную адресацию взять не трудно.

##Это оптимизация.
Ой ли?

Вот пример программы:

type alpharec=record
 a,b,c:integer;
end;

var ga,gb,gc:integer;
x:alpharec;

procedure n1;
begin
 x.a:=1;
 x.b:=(x.a+4)*10;
 x.c:=x.a-x.b;
 writeln(x.c);
end;

procedure n2;
begin
 ga:=1;
 gb:=(ga+4)*10;
 gc:=ga-gb;
 writeln(gc);
end;

begin
 n1;
 n2;
end.


Вот во что оно компилируется с -O3:

P$PROGRAM_N1:
subl $4,%esp
movl %ebx,(%esp)
# [11] x.a:=1;
movl $1,%eax
# [12] x.b:=(x.a+4)*10;
movl %eax,U_P$PROGRAM_X
addl $4,%eax
imull $10,%eax
movl %eax,U_P$PROGRAM_X+4
# [13] x.c:=x.a-x.b;
movl U_P$PROGRAM_X,%edx
movl U_P$PROGRAM_X+4,%eax
subl %eax,%edx
movl %edx,U_P$PROGRAM_X+8
# [14] writeln(x.c);
call fpc_get_output
movl %eax,%ebx
movl U_P$PROGRAM_X+8,%ecx
movl %ebx,%edx
movl $0,%eax
call fpc_write_text_sint
call FPC_IOCHECK
movl %ebx,%eax
call fpc_writeln_end
call FPC_IOCHECK
# [15] end;
movl (%esp),%ebx
addl $4,%esp
ret

P$PROGRAM_N2:
subl $4,%esp
movl %ebx,(%esp)
# [19] ga:=1;
movl $1,%eax
# [20] gb:=(ga+4)*10;
movl %eax,U_P$PROGRAM_GA
addl $4,%eax
imull $10,%eax
movl %eax,U_P$PROGRAM_GB
# [21] gc:=ga-gb;
movl U_P$PROGRAM_GA,%edx
movl U_P$PROGRAM_GB,%eax
subl %eax,%edx
movl %edx,U_P$PROGRAM_GC
# [22] writeln(gc);
call fpc_get_output
movl %eax,%ebx
movl U_P$PROGRAM_GC,%ecx
movl %ebx,%edx
movl $0,%eax
call fpc_write_text_sint
call FPC_IOCHECK
movl %ebx,%eax
call fpc_writeln_end
call FPC_IOCHECK
# [23] end;
movl (%esp),%ebx
addl $4,%esp
ret

Не трудно заметить, что отличие - в типе адресации нескольких команд, дающее разницу в один такт на штуку.
Что пренебрежимо мало по сравнению с потерей удобства.

Итого, плодить шорткатные глобальные переменные смысла всё ещё не вижу.