Форум: "Прочее";
Текущий архив: 2007.03.25;
Скачать: [xml.tar.bz2];
ВнизКлючевое слово "object" Найти похожие ветки
← →
Servelat © (2007-03-03 17:04) [0]В первую очередь пошел искать в хелпе, не нашел (хотя узнал много интересного ^^), в яндексе тоже глухо. В книжках по делфи, которые мне попадались о сабже тоже нет упоминаний. Итак, что же делает ключевое слово "object"? Ссылки на документацию приветствуются, но и ответом "своими словами" не побрезгую.
ЗЫ В общем-то, какой-то конкретной цели не преследую, просто для повышения образованности.
← →
Desdechado © (2007-03-03 17:06) [1]Это устаревший способ работы с самодельными объектами. Теперь гораздо целесообразнее использовать class
← →
Servelat © (2007-03-03 17:11) [2]> Это устаревший способ работы с самодельными объектами
Моё любопытсво все еще не удовлетворено :). Чем object отличается от class, что именно устарело. Попадался мне как то код с этим волшебным словом, так что хотелось бы понять что это из себя представляет.
← →
alien1769 © (2007-03-03 17:13) [3]Идеальное слово для описания всего.
Даже для искуственного интелекта.
← →
PEAKTOP © (2007-03-03 17:14) [4]> Desdechado © (03.03.07 17:06) [1]
> Это устаревший способ работы с самодельными объектами. Теперь гораздо целесообразнее использовать class
В Делфях классом считается все, что прождено от TObject. Но проблема в том, что нужно было объявить сам TObject в юните "system.pas", для чего и использовали ключевое слово языка Паскаль object. Ключевое слово class не является зарезервированным словом языка Паскаль, хотя поддерживается и зарезервировано сейчас почти всеми компиляторами (Delpi, FPC, Lazarus, Kylix, TNT).
← →
DrPass © (2007-03-03 17:17) [5]
> Чем object отличается от class, что именно устарело
object в общем-то позволяет создать статический объект. Подробнее о нем ты лучше прочитай в любом руководстве по Турбо-Паскалю 5.5-7.0, с тех пор ничего не изменилось. В Delphi object только для совместимости и поддерживается
← →
Servelat © (2007-03-03 17:19) [6]> [5] DrPass © (03.03.07 17:17)
Руководство щас погуглю.
А под статическим объектом понимается объект, все методы которого статические? А конструктор с деструктором присутствуют? (=
← →
default © (2007-03-03 17:22) [7]Servelat © (03.03.07 17:19) [6]
нет просто память под такой объект выделяется статически, то есть при загрузке программы в память, а не когда программист соизволит
← →
Ketmar © (2007-03-03 17:34) [8]> PEAKTOP © (03.03.07 17:14) [4]
TObject = class;
TClass = class of TObject;
купи "твикс". жуй. молчи. заодно почитай материалы по Object Pascal (тому, из которого упёрли концепцию обёектов в Turbo Pascal 5.5).
← →
Servelat © (2007-03-03 17:41) [9]Собственно, вопрос закрыт; нашел у себя на винте UserGuide по BP70 (что прям удивительно, на русском), где тема полностью раскрыта, просвещаюсь. Всем спасибо за ответы.
← →
TUser © (2007-03-03 18:43) [10]Удобен тем, что содержит в себе идеи ООП (наследование) и не требует лишней работы и памяти. Посмотри, сколько всего делается и создается в конструкторе TObject! Если мне нужно будет использовать сотню-другую тысяч объектов, то выбор будет за object"ами, а не за классами, наверное.
← →
Loginov Dmitry © (2007-03-03 18:58) [11]> Если мне нужно будет использовать сотню-другую тысяч объектов,
> то выбор будет за object"ами, а не за классами, наверное.
Так и до record"a дойти не долго :))
← →
PEAKTOP © (2007-03-03 19:03) [12]> Ketmar © (03.03.07 17:34) [8]
Ты не прав.
← →
TUser © (2007-03-03 19:11) [13]> Loginov Dmitry © (03.03.07 18:58) [11]
Структурное программирование рулит. Я серьезно.
← →
tesseract © (2007-03-03 20:52) [14]
> Посмотри, сколько всего делается и создается в конструкторе
> TObject! Если мне нужно будет использовать сотню-другую
> тысяч объектов, то выбор будет за object"ами, а не за классами,
> наверное.
Гм. Наверное наооборот :-) class как раз под такие случаи и заточен :-)
← →
TUser © (2007-03-03 21:04) [15]> tesseract © (03.03.07 20:52) [14]
На пустых объектах/классах поэкспериментировал, 100000000 TObject"ов создано за 19 секунд и использовано 720 метров памяти, столько просто обджектов - за ноль секунд и использовано памяти метр с копейками. Если объекты буду содержать какие-то данные и выполнять какие-то действия, то и на сотне разницу почуствуем.
← →
Loginov Dmitry © (2007-03-03 21:10) [16]> использовано памяти метр с копейками
Сами-то в это верите?
← →
Loginov Dmitry © (2007-03-03 21:11) [17]> Если объекты буду содержать какие-то данные и выполнять
> какие-то действия, то и на сотне разницу почуствуем.
Или эта разница просто-напросто исчезнет.
← →
TUser © (2007-03-03 21:24) [18]> Сами-то в это верите?
Четырехзначная цифирь, начинается на один ...
← →
vuk © (2007-03-03 22:13) [19]to PEAKTOP © (03.03.07 17:14) [4]:
Что за трава? Или это были грибы? :)))
to TUser © (03.03.07 21:04) [15]:
>На пустых объектах/классах поэкспериментировал
Угу, а производительность будем на "Hello, World!" мерять. :)
Пустой object занимает 0 байт, в отличие от наследника TObject, который занимает 4 минимум байта.
>Если объекты буду содержать какие-то данные и выполнять какие-то
>действия, то и на сотне разницу почуствуем.
Фиг. Если в object будет поле, допустим integer, вес уравняется. Преимуществ не будет почти никаких. При одинаковом количестве полей будут те самые 400 байт на сотне.
И вообще, что-то цифры подозрительные. Что там в коде-то?
← →
Игорь Шевченко © (2007-03-04 00:06) [20]TUser © (03.03.07 21:04) [15]
Тут такой момент - пустые объекты, как и пустые классы никому не нужны. Давай ты полные насоздаешь ?
← →
TUser © (2007-03-04 04:27) [21]33 секунды для объектов vs минута думанья и Out of memory в случае классов :) Объекты и классы содержали по два поля типа integer + то, что от TObject. Говорю же - объекты (те, которые экземпляры классов) память любят кушать. Больше, чем объекты, которые просто, т.е. типа record с наследованием.
← →
Loginov Dmitry © (2007-03-04 08:56) [22]> Говорю же - объекты (те, которые экземпляры классов) память
> любят кушать. Больше, чем объекты, которые просто, т.е.
> типа record с наследованием.
Ай-ай! Какая беда! 100000000 объектов всю память скушали!
Только нюансик один: что вообще в принципе можно делать с таким количеством объектов? Их же надо где-то индексировать (в массиве там, или в списке), это еще 400 метров памяти надо. Нужен метод доступа, поиска и т.п., что при таком количестве объектов (будь то object или class) будет выполняться катастрофически долго.
То есть пример со 100000000 объектов выглядет очень уж надуманным.
← →
vuk © (2007-03-04 10:57) [23]to TUser © (04.03.07 04:27) [21]:
>Говорю же - объекты (те, которые экземпляры классов) память любят
>кушать. Больше, чем объекты, которые просто, т.е. типа record с
>наследованием.
А вот мои подсчеты говорят, что памяти в результате понадобится одинаковое количество. Догадываетесь, почему? А времени, тут да, создание экземпляра класса требует чуть больше, т.к. экземпляру класса требуется инициализация, а у object её по-умолчанию нет, но это опять же, до тех пор пока там данных в нормальном количестве нет.
Поэтому еще раз говорю, что-то там не то с методикой. Код в студию.
← →
vuk © (2007-03-04 11:17) [24]Чтобы вопросов не возникало:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils,
Windows;
type
Cls = class
a,b: integer;
end;
PObj = ^Obj;
Obj = object
private
a,b: integer;
end;
procedure AllocCls(count: integer);
var
i: integer;
begin
for i := 0 to Count - 1 do
Cls.Create;
end;
procedure AllocObj(count: integer);
var
i: integer;
o: PObj;
begin
for i := 0 to Count - 1 do
new(o);
end;
var
T1, T2, T3: Cardinal;
S1, S2, S3: Cardinal;
begin
T1 := GetTickCount;
S1 := GetHeapStatus.TotalAllocated;
AllocCls(10000000);
S2 := GetHeapStatus.TotalAllocated;
T2 := GetTickCount;
AllocObj(10000000);
S3 := GetHeapStatus.TotalAllocated;
T3 := GetTickCount;
writeln(Format("%d %d", [T2-T1, S2-S1]));
writeln(Format("%d %d", [T3-T2, S3-S2]));
readln;
end.
Результат (CoreDuo 6600 2.4 ГГц, RAM 2ГБ):
500 120000000
109 120000000
Памяти требуют оба варианта, что естественно для данного случая, одинаково, несмотря на разницу в размерах экземпляров. А чем разница во времени обусловлена - см. выше.
← →
Olivetti (2007-03-04 12:23) [25]Но проблема в том, что нужно было объявить сам TObject в юните "system.pas", для чего и использовали ключевое слово языка Паскаль object
О как. Оказывается, object использовали для создания class. Вот так и возникают религии. Хвала всевышнему, объект придумавшему, ибо класс и экземпляр класса - суть порождение его. Во имя object, class и instance его! Аминь.
← →
Virgo_Style © (2007-03-04 12:29) [26]Я, наверное, еретик... бо у меня возник вопрос, откуда же в таком случае взялся сам object :0)
и если от record"а, то откуда взялся record? и так далее... )
← →
vuk © (2007-03-04 12:37) [27]to Virgo_Style © (04.03.07 12:29) [26]:
>откуда взялся record?
record был всегда :)
← →
Virgo_Style © (2007-03-04 12:50) [28]vuk © (04.03.07 12:37) [27]
Аминь %-)
← →
Palladin © (2007-03-04 13:25) [29]record придумал Вирт, а Вирта придумали мама с папой... выводы очевидны :)
← →
default © (2007-03-04 13:46) [30]хех
неужто настолько делать нефига людям что ещё не влом думать о такой архаике как object:)
← →
Ketmar © (2007-03-04 14:03) [31]> PEAKTOP © (03.03.07 19:03) [12]
расслабься. приведённый мной код -- цитата из system.pas. советую перед тем, как вещать, таки читать генофонд. ну и -- да, язык, о котором вещаешь, тоже выучить бы не помешало.
← →
просто так (2007-03-04 14:07) [32]>>неужто настолько делать нефига людям что ещё не влом думать о такой архаике как object:)
что за наезды на обжект? фундаментальная штука. это класс придумка борланда, насколько помню в стандарте паскаля нет такого словечка:)
← →
_uw_ (2007-03-04 14:08) [33]object - это отнюдь не архаика.
Во-первых, без слова object затруднительно определить callback типа
type
TForProgressBar = procedure(Current, Total: Integer) of object;
Это, ясное дело, очень мощное и "современное" средство, не реализованное, к примеру, в С++. Там аналог убогий.
Во-вторых, object позволяет создавать "интеллектуальные записи" (с методами), которые к тому же обладают свойством наследования. В некоторых диалектах С я встречал это свойство "наследования" с применением анонимных структур.
← →
Ketmar © (2007-03-04 14:10) [34]> просто так (04.03.07 14:07) [32]
я-таки скажу откровение: в том стандарте и object ни разу нет.
← →
просто так (2007-03-04 14:15) [35]
> я-таки скажу откровение: в том стандарте и object ни разу
> нет
да, точно ))), но класс развитие обжекта, причем не всегда удобное, и объявлять обжект устаревшим неправильно, для небольших структур данных он подходит гораздо больше чем класс
← →
default © (2007-03-04 14:16) [36]_uw_ (04.03.07 14:08) [33]
ну я не про все применения ключевого слова object, а именно про то применение которое оставлено для совместимости
в .NET структуры наделённые свойствами ООП юзаются порой в качестве "легковесных" объектов ибо для них в стеке память выделяется(то есть быстро) и освобождается быстро(а не когда GC соизволит)
в каком-то таком же смысле использования object-объектов возможно и может быть оправдано
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2007.03.25;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.195 c