Вот читал "Библию Делфи" Флёного... Там есть глава об указателях (стр.240).
Цитата:
Допус-
тим, у вас есть процедура с именем муРгос, у которой есть два параметра:
число и строка. Как происходит вызов такой процедуры, и как ей передаются
эти параметры? Очень просто. Сначала параметры принимаются в стек (на-
помню, что стек — это область памяти для хранения временных или ло-
кальных переменных). Первой заносится строка, затем число и после этого
вызывается процедура. Прежде чем процедура начнет свое выполнение, она
извлекает эти параметры из стека в обратном порядке.
Теперь вспомним о наших параметрах. Первый — это число, которое будет
занимать два байта. Когда происходит запись его в стек, оно займет там свои
положенные два байта. Второй параметр — строка. Каждый символ стро-
ки — это отдельный байт. Допустим, что строка состоит из 10 символов. Это
значит, для передачи такой строки в процедуру в стеке понадобится 10 байт
плюс один байт для указания конца строки или ее размера (это зависит от
типа строки). Всего для передачи в процедуру понадобится в стеке как мини-
мум 12 байт. Это не так уж и много, поэтому такое можно себе позволить.
А теперь представьте, что строка, которую надо передать в процедуру, состоит
из 1000 символов. Вот тут нам понадобится в стеке уже около килобайта. При
нынешних размерах памяти на это уже никто не обращает внимания, но
программисты забывают про то, что такая строка сначала копируется в память
стека, а потом извлекается из него. Такое копирование большого размера па-
мяти отнимает достаточно много времени и ваша программа тратит лишнее
время на бессмысленное клонирование в памяти большой строки.
Выход из сложившейся ситуации достаточно прост. Можно не передавать
строку, а только передать указатель на область памяти, где находится эта
строка. Любой указатель занимает всего четыре байта, а это уже существен-
ная экономия. Мы просто даем нашей процедуре понять, где найти строку.
|
Теперь вопрос: Как для большего быстродействия мне передовать параметры в поцедуру или функцию?
--------------------------------------------
1)
Код:
var s: sttring; p: pointer;
p := @s;
myProc(string(p^));
procedure myProc(value: string);
begin
showMessage(value);
end;
--------------------------------------------
2)
Код:
var s: sttring; p: pointer;
p := @s;
myProc(p);
procedure myProc(value: pointer);
begin
showMessage(string(value^));
end;
--------------------------------------------
Спасибо заранее!