Форум: "Основная";
Текущий архив: 2004.01.20;
Скачать: [xml.tar.bz2];
ВнизTNotifyEvent Найти похожие ветки
← →
YuRock (2004-01-06 20:05) [40]> Vuk © (06.01.04 20:00) [37]
Я имелл в виду классику ("классы состоят из методов (функций) и свойств (данных)")
← →
jack128 (2004-01-06 20:08) [41]Вот код для строк
{$O-}
procedure SameProcValue(s: string);
begin
end;
procedure SameProcConst(const s: string);
begin
end;
procedure SameProcVar(var s: string);
begin
end;
procedure TForm1.Button1Click(Sender: TObject);
var
s: string;
begin
S := StringOfChar("A", 10);
SameProcValue(s); // здесь breakpoint и View CPU
SameProcConst(s);
SameProcVar(s);
end;
{$O+}
В твоем примере, как и в моем передается указатель на данные (указатель на первый символ строки или на первый элемент массива)
← →
Тимохов (2004-01-06 20:10) [42]jack128 © (06.01.04 20:08) [41]
Да наверное, ты прав. Я еще посмотрю это на свежую голову.
Наверное, только перед SameProcValue делается копия s, причем не в стеке, и указатель на эту копию и передается.
Да будем изучать asm.
← →
jack128 (2004-01-06 20:10) [43]ну то есть в моем примере отличие в SameProcVar.
tp = procedure ({const}S: sss) of object; - закоментировать const - не коментировать - результат один. Ты попробуй поэксперементировать с даными у которых SizeOf(MyType) = 4
← →
YuRock (2004-01-06 20:12) [44]> Тимохов © (06.01.04 19:50) [33]
Нет. Затолкается в стек только когда вообще ничего не писать перед параметром.
А const - то же, что и var, но с одним отличием: дельфя не даст откомпилить код, в котором будет хоть какой-нибудь намек на изменения параметра, переданного с директивой const (т.е. используется только для скорости), а var наоборот - для изменения и предназначен (хотя способ передачи идентичен const).
← →
Тимохов (2004-01-06 20:13) [45]jack128 © (06.01.04 20:10) [43]
с Byte, Integer, Double - все работает ОК.
← →
Тимохов (2004-01-06 20:14) [46]YuRock © (06.01.04 20:12) [44]
Вот похоже что вы не правы в "Затолкается в стек только когда вообще ничего не писать перед параметром", т.к. если бы это было так, то мой пример не работал бы. Наверное затолкается в стек все тот указатель, только на копию строки, созданную не в стеке.
Буду асм смотреть.
← →
jack128 (2004-01-06 20:19) [47]
> Тимохов © (06.01.04 20:13) [45]
> jack128 © (06.01.04 20:10) [43]
> с Byte, Integer, Double - все работает ОК.
Да?? Странно.. Напиши сюда о результах своих иследований -)
← →
YuRock (2004-01-06 20:28) [48]> Тимохов © (06.01.04 20:14) [46]
Нет. Он работает не по-этому. А потому, что в дельфях переменная типа стринг - это и есть указатель.
Правда, менять она его не дает, если var не написать :)
← →
Тимохов (2004-01-06 20:29) [49]А что писать? Просто в примере замени последовательно на byte, integer, double. Все работает.
type
tc = class
public procedure Show(const a: ТИП);
end;
procedure tc.Show;
begin
showmessage(floattostr(a));
end;
type
tp = procedure ({const}S: ТИП) of object;
procedure TForm1.Button17Click(Sender: TObject);
var
p: tp;
c: tc;
i: ТИП;
begin
c := tc.create();
tmethod(p).code := @tc.SetS;
tmethod(p).data := c;
i := 1223424;
p(i);
end;
← →
Тимохов (2004-01-06 20:32) [50]YuRock © (06.01.04 20:28) [48]
Вы не правы - если ничего не писать, то менять параметр можно.
Проверил.
← →
YuRock (2004-01-06 20:42) [51]> Тимохов © (06.01.04 20:14) [46]
Да, действительно мистика какая-то происходит... Не только для стринга, а для любых типов так... Наверно, все параметры на самом деле по 4 байта, а что там - адрес или значение - придумывает компилятор в зависимости от кода... Хотя это бред...
← →
jack128 (2004-01-06 20:43) [52]
> А что писать? Просто в примере замени последовательно на
> byte, integer, double. Все работает.
Я имел ввиду, вот это
> Да будем изучать asm.
Я с асмом на вы.
Лично мои домыслы таковы.
по значению.
Для типов SizeOf(Type) <= 4 передают копию параметра с стек.
Для типов SizeOf(Type) > 4 передают адрес параметра с стек.
по ссылке.
Для всех типов передается адрес параметра в стек
по константной ссылке
Для типов SizeOf(Type) <= 4 передают копию параметра с стек.
Для типов SizeOf(Type) > 4 передают адрес параметра с стек.
Если скажите что означает lea eax, [тра - ля - ля] , то выскажусь точнее -)
← →
YuRock (2004-01-06 20:45) [53]> Тимохов © (06.01.04 20:32) [50]
Ну, правильно, можно, только при выходе из функции он "вернется на место"... Хотя если это в примере [15], то я не удивлюсь уже ничему.
← →
jack128 (2004-01-06 20:53) [54]
> Наверно, все параметры на самом деле по 4 байта, а что там
> - адрес или значение - придумывает компилятор в зависимости
> от кода... Хотя это бред...
Почему бред?
Вот еще один пример
{$O-}
procedure SameProcValue(s: string);
begin
PByte(s)^ := 49;
end;
procedure SameProcConst(const s: string);
begin
PByte(s)^ := 49;
end;
procedure SameProcVar(var s: string);
begin
PByte(s)^ := 49;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
s: string;
begin
S := StringOfChar("A", 10);
SameProcValue(s);
ShowMessage(s); s[1] := "A";
SameProcConst(s);
ShowMessage(s); s[1] := "A";
SameProcVar(s);
ShowMessage(s);
end;
{$O+}
А теперь замените тип параметра на integer и в процедурах напишите PInteger(@s)^ := 10; и посмотрите на результат (после выхода из каждой процедуры обнуляйте переменную s)
Страницы: 1 2 вся ветка
Форум: "Основная";
Текущий архив: 2004.01.20;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.01 c