Лекс Айрин писал(а):olegy123 писал(а):сейчас модно не локализировать переменные, а все толкать в стэк.
Дело не в моде. Это просто особенности реализации компилятора. Для процессора проще использовать или особый регистр-счетчик, либо использовать переменную. И локальные переменные располагаются в стеке, так как ими там проще манипулировать.
Локальные переменные располагаются в стеке не потому, что ими там проще манипулировать, а для обеспечения возможности рекурсивного вызова функций. Видимо вы ещё молоды и не застали того времени, когда у IBM PС был BIOS, у которого локальные переменные процедур и функций располагались не в стеке, а в общей памяти по фиксированным адресам, из-за чего были большие проблемы с организацией реальной многозадачности. IBM решил эту проблему, когда выпустил свои PS/2, у которых впервые в серии IBM PC был полностью рекурсивный BIOS и реально многозадачная OS/2. У остальных производителей это проблема была полностью решена только с переходом на платформу i386.
Что касается исходного вопроса и спора про классы и объекты.
Любая переменная класса всегда есть указатель на область памяти, где размещаются данные класса. Поэтому для упрощения написания кода символ ^ после имени переменной опускается. Именно поэтому с точки зрения компилятора писать "PForm(p)^.Caption" неправильно, а "TForm(p).Caption:=..;" правильно.
Что касается объектов, то это именно record с методами. То есть, когда вы пишите:
- Код: Выделить всё
type
TTest1 = object
iT: integer;
fp: double;
end;
procedure TestProc;
var
t1: TTest1;
begin
t1.iT := 4;
t1.fp := 12.3;
end;
То, в отличие от классов, никаких ошибок в процессе выполнения не будет, поскольку под переменную t1 будет выделено необходимо количество памяти для хранения данных полей объекта TTest1. По этой же причине нет необходимости вызывать при выходе деструктор и явно освобождать память.
Но подобный подход не позволяет использовать виртуальные конструкторы, которые есть у классов, поскольку в этом случае компилятор до момента вызова конструктора не будет знать, сколько же реально памяти необходимо выделить для хранения данных класса. А на этом механизме построена вся визуальная среда программирования в Delphi, когда базовая оболочка может вызывать виртуальные конструкторы компонентов, о конечной структуре которых она ничего не знает.
Так что у каждого подхода есть свои плюсы и минусы.