Статическая переменная процедуры в Delphi - PullRequest
1 голос
/ 30 января 2010

В чем разница в управлении памятью переменных a и b?

Являются ли они одинаковыми статическими переменными, но видимость b локальна?

Можно ли объявлять статическую переменную в процедуре или функции?

const 
  a: string = 'aaa';

procedure SubMethod;
const 
  b: string = 'bbb';
begin
  a := a + 'a';
  b := b + 'b';
end;

1 Ответ

6 голосов
/ 30 января 2010

Да, они одинаковы. Как видно из разборки, «a» и «b» живут в последовательных ячейках памяти:

Unit26.pas.32: a := a + 'a';
004552C8 B814874500       mov eax,$00458714
004552CD BAF0524500       mov edx,$004552f0
004552D2 E809F8FAFF       call @LStrCat
Unit26.pas.33: b := b + 'b';
004552D7 B818874500       mov eax,$00458718
004552DC BAFC524500       mov edx,$004552fc
004552E1 E8FAF7FAFF       call @LStrCat

В моем случае @a = 00458714 $, @b = 00458718 $.

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

Если у вас не включен этот параметр, вы должны вывести 'b' из процедуры. Следующий код не скомпилируется.

var
  a: string = 'aaa';

procedure SubMethod;
var
  b: string = 'bbb';  // <-- compilation stops here
begin
  a := a + 'a';
  b := b + 'b';
end;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...