![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#31
|
||||
|
||||
|
Цитата:
Код:
type
TMyObject = class
private
FMem: Pointer;
public
constructor Create(MemSize: Integer = 8192);
destructor Destroy; override;
property Mem: Pointer read FMem;
end;
constructor TMyObject.Create(MemSize: Integer);
begin
GetMem(FMem, MemSize);
end;
destructor TMyObject.Destroy;
begin
FreeMem(FMem);
ShowMessage(ClassName + '.Destroy');
inherited;
end;
procedure TMainForm.Button1Click(Sender: TObject);
var
MyArray: array of TMyObject;
begin
SetLength(MyArray, 2);
MyArray[1] := TMyObject.Create;
SetLength(MyArray, 1);
MyArray[0] := TMyObject.Create;
end; |
|
#32
|
||||
|
||||
|
При неправильном подходе к задаче, можно долго наслаждаться чем угодно и как угодно. Постоянно путаешь выделение памяти и объекты.
|
|
#33
|
||||
|
||||
|
Цитата:
Код:
procedure TMainForm.Button1Click(Sender: TObject); var MyArray: array [0..1] of TMyObject; begin MyArray[1] := TMyObject.Create; MyArray[0] := TMyObject.Create; end; Код:
procedure TMainForm.Button1Click(Sender: TObject); var MyObj0, MyObj1: TMyObject; begin MyObj1 := TMyObject.Create; MyObj0 := TMyObject.Create; end; Или вот ещё небольшой пример того, почему разрушение массива не должно вызывать деструкторы объектов: Код:
procedure TForm1.Button1Click(Sender: TObject);
var
A: array of TEdit;
i: Integer;
begin
// Находим нужные элементы управления на форме и помещаем в массив ссылки на них:
SetLength(A, FCount);
for i := 1 to FCount do
begin
A[i] := (FindComponent('Edit'+IntToStr(i)) as TEdit);
end;
// Теперь через массив удобно работать с этими элементами управления.
// А после выхода из этого обработчика динамический массив будет автоматически разрушен
// и что если при этом он вызовет деструкторы элементов управления?
// Они же пропадут с формы... Разве входило в планы разрушить интерфейс пользователю?
end; |
| Этот пользователь сказал Спасибо poli-smen за это полезное сообщение: | ||
Aristarh Dark (31.03.2014)
| ||
|
#34
|
||||
|
||||
|
Как я понял из всего этого холивара, Фриман имеет ввиду, зачем разрешено в дельфи использовать дин. массивы для объектов и откуда взялась фишка давать в примерах использование оных для объектов.
Вот и вся суть холивара. |
| Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение: | ||
Freeman (01.04.2014)
| ||
|
#35
|
||||
|
||||
|
а еще у Win32 Common Controls можно к элементам привязать указатели на объекты, которые тоже не освобождаются при удалении элемента. тоже запрещать что-ли?
|
|
#36
|
||||
|
||||
|
Да вообще указатели запретить... И все ЯВУ... Пусть на ассемблере пишут, а то зажрались...
|
|
#37
|
||||
|
||||
|
Цитата:
![]() Наоборот, запретить ассемблер, все ЯВУ, разрешить только жабу, C# и скрипты. Привет, андройд. |
|
#38
|
||||
|
||||
|
Цитата:
Цитата:
Свою задачу как разработчика ЯП я вижу в восстановлении справедливости при сохранности природы компилируемого кода как таковой. В частности, вместо сборки мусора я хочу задействовать граф владения, использующий счетчик ссылок когда потребуется и вычисляемую еще на этапе компиляции достижимость объектов во всех остальных случаях. |
|
#39
|
||||
|
||||
|
У вашего подхода есть один фатальный недостаток...
Код:
TMyThread.Create(...); Ссылок на него нету. Вы разрушите объект? |
|
#40
|
||||
|
||||
|
Прямые указатели зачастую позволяют значительно повысить скорость обработки. Например, можно иметь буферы, по которым бегают несколько указателей, и все эти указатели объединены в структуру. Или обход массива через указатели. Или из одних и тех же объектов в памяти строятся разные не владеющие ими структуры (дерево и массив, к примеру).
Многие из подобных вещей после запрета указателей, конечно, остаются реализуемыми, но с большими проблемами и теряют всю суть. А если указатели не запретить, то и собирать мусор каким-либо образом становится почти невозможно - ведь я запросто могу поставить указатель не на начало объекта (напр. на середину массива или на какое-то поле объекта), и сохранить его в какой-нибудь структуре. И будет совершенно непонятно, надо удалять объект или нет. Что же касается "за памятью должен следить компьютер, а не программист" - видел как-то программу на .NET, которая после часа работы написала "Not Enough Memory" и отрубилась. Также сталкивался с тем, что всеми любимый SharpZipLib течет на некоторых архивах (у меня он обрабатывал круглые сутки десятки тысяч штук). То есть кривые руки и отсутствие мозгов даже на таком ограниченном языке, как C#, могут добиться утечек. А при прямых руках - мне бы и в голову не пришло уменьшать длину массива, не удаляя объекты, если я знаю, что это массив объектов. Поэтому я предпочитаю в любых мало-мальски критичных вещах следить за памятью самостоятельно. В большинстве случаев это не так трудно. Цитата:
А еще их легко ломать... Последний раз редактировалось Bargest, 01.04.2014 в 11:38. |
|
#41
|
||||
|
||||
|
Цитата:
|
|
#42
|
||||
|
||||
|
Концепции ООП:
1) Всё - объект. Объект - экземпляр класса. Объект - абстракция. 2) Классы могут выстраивать структуру (как минимум дерево). 3) Объекты могут взаимодействовать друг с другом. Ну или из любого учебника - "полиморфизм, инкапсуляция, наследование". Основная цель ООП - абстрагироваться от компьютера, описать множество сущностей и их взаимодействие. Сюда же входит и желание забыть о конечных ресурсах: ведь мы решаем какую-то абстрактную задачу. В концепции ООП нет места таким понятиям, как "низкое быстродействие" или "конечная память". Все решается на сферических сущностях в вакууме (хотя из-за того, что это работает на реальном железе, порой приходится-таки учитывать расход ресурсов). Все это сделано на уровне байт-кода в жабе/c#. Пруфлинк - почитать Instruction Set на документации oracle или доки на IL (с такими не сталкивался, реверсил C# "на ходу"). Последний раз редактировалось Bargest, 01.04.2014 в 21:28. |
|
#43
|
||||
|
||||
|
Цитата:
Где будут описаны твои переменные со ссылкой на создаваемый поток? Локальная переменная в процедуре точки входа будет считаться владеющей ссылкой и будет существовать всё время в пределах своей области видимости -- всё время, пока выполняется begin..end программы. Цитата:
Цитата:
|
|
#44
|
||||
|
||||
|
Цитата:
new-instance создает непосредственно объект. Далее есть instance-of, проверяющий, является ли объект экземпляром класса или его наследником. Во все invoke-и и getfield/putfield передается строка с именем класса или же экземпляр класса, от которого в случае несущестовования метода/поля будет браться родитель и искаться соответствующий метод/поле. Ну и интерфейсы еще прилеплены. Таким образом, на уровне архитектуры машины может быть построено дерево классов и происходить работа с ним. Полноценная реализация наследования (статического, разумеется). Цитата:
ООП же требует, чтобы весь алгоритм был взаимодействием объектов, что вообще-то идет поперек принципа работы машины - последовательного выполнения действий. Понятно, что взаимодействие объектов можно описать последовательностью действий, но это уже выход за рамки ООП и переход к реализации, так сказать, "движка ООП". Последний раз редактировалось Bargest, 01.04.2014 в 23:49. |
|
#45
|
||||
|
||||
|
Цитата:
Зато ближе познакомился с байт-кодом JVM. Ты в очередной раз на меня положительно влияешь. ![]() У меня уже сложилась в голове структура байт-кода Кантора, и теперь я могу сравнивать ее с другими реализациями. Шутки шутками, но мой байт-код больше всего похож на Бейсик 80-х. Стало также понятно, почему так быстро удалось создать свой байт-код разработчикам "Фантома": они наверняка слегка изменили правила наследования и поиска методов, а всё остальное оставили как в Java. Это мои предположения, лезть в "Фантом" больше не хочется. Цитата:
В случае же ООП полной замены не произошло. ОО-средства были добавлены (прикручены сбоку -- в моей трактовке) в структурные языки, и классы с объектами стали сосуществовать рядом с обычными, необъектными типами. ОО в виде расширений было массовым, и со временем закрепилось в сознании именно в таком виде. Мол, объект -- это "запись с методами", доступная или напрямую, или по указателю. Стали накручивать на это другие слои, вроде интерфейсов, фабрик классов, и пошло-поехало. На самом же деле, если почитать классические труды по ООП (того же Алана Кея), в них нигде не говорится, что объект -- это именно запись с методами. Даже посылку сообщения можно трактовать как прямой вызов метода, если требуется статическая типизация. Вот я и поставил перед собой задачу вписать ООП в компилятор заподлицо, чтобы программистам было понятно, что |