Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.03.2008, 14:21
Аватар для atomAltera
atomAltera atomAltera вне форума
Прохожий
 
Регистрация: 13.03.2008
Сообщения: 13
Репутация: 10
Радость Указатели

Вот читал "Библию Делфи" Флёного... Там есть глава об указателях (стр.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;

--------------------------------------------
Спасибо заранее!

Последний раз редактировалось atomAltera, 13.03.2008 в 14:24.
Ответить с цитированием
  #2  
Старый 13.03.2008, 14:38
AlexBlack AlexBlack вне форума
Прохожий
 
Регистрация: 12.10.2007
Сообщения: 12
Репутация: 10
По умолчанию

Первый вариант - та самая передача строки от которой ты так стремишся избавиться.

Второй - передача адреса строки.
Можно делать это без введения дополнительной переменной:

Код:
var s: sttring;
myProc(@s);
procedure myProc(value: pointer);
begin
    showMessage(string(value^));
end;

Конечно, так можно. Но
Этот вариант во-первых вводит нас в заблуждение. В параметрах
описан указатель, а мы работем с ним как со строкой.

Во-вторых. Пераметр становится параметров по ссылке вместо
параметра по значению. Так лучше тогда сразу записать

procedure myProc(var value: String);

Будет передаваться только указатель строки.

Другой вариант использовать PChar.

Надеюсь, не запутал тебя своими рассуждениями и внес хлть какую-то ясность.

И еще мелким шрифтом.
В Delphi String м.б. как ShortString, так и AnsiString
(и wide ...). Так вот ShortString передается как указано в книге. Насчет
AnsiString не уверен. Нужно посмотреть в справке. В принципе, AnsiString является указателем и компилятор (по-моему мнению) может быть достаточно разумным и разделить два варианта передачи - по ссылке и по значению передавая при этом всегда только указатель.
Ответить с цитированием
  #3  
Старый 13.03.2008, 17:33
Аватар для atomAltera
atomAltera atomAltera вне форума
Прохожий
 
Регистрация: 13.03.2008
Сообщения: 13
Репутация: 10
По умолчанию

Спасибо AlexBlack!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 09:40.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter