Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.02.03;
Скачать: CL | DM;

Вниз

Вопрос по указателям   Найти похожие ветки 

 
Dan   (2008-01-11 18:27) [0]

Допустим, есть некий класс:

type
 PClass = ^TClass;
 TClass = class
 public
   Field1 : Byte;
   Field2 : Integer;
   Field3 : String;
 end;

Самый быстрый и лучший способ работы с классом этот:

...
var
   C : TClass;
 pC : PClass;
begin
 pC := @C; pC^ := TClass.Create; pC^.Field := 1;
end;
...

или этот:

...
var C : TClass;
begin
 C := TClass.Create; pC.Field := 1;
end;
...

P.S. Думаю, через указатели быстрее.


 
Джо ©   (2008-01-11 18:30) [1]

C : TClass — это УЖЕ указатель.


 
@!!ex ©   (2008-01-11 18:32) [2]

Парень, не совершай ошибки...
потом заколебешься ее разгребать.. Я пол года баги в проекте ловил...
Забуть о PClass = ^TClass;

В таком случае:
C : TClass;
С - уже является указателем на класс!!! PClass - это указатель, на указатель... Такая хренатень ведет к очень неприятным багам, которые сложно поймать... слава всем богам, мне вовремя объяснили, что не надо использовать указатели на указатели, иначе бы мы проект так и не сдали...


 
Palladin ©   (2008-01-11 18:33) [3]

как все жестоко...


 
MetalFan ©   (2008-01-11 18:38) [4]


> P.S. Думаю, через указатели быстрее.

конечно быстрее... через попу ухо пяткой чесать всегда быстрее)


 
Dib@zol ©   (2008-01-11 18:45) [5]

> конечно быстрее... через попу ухо пяткой чесать всегда быстрее)

Ну не совсем через попу, коненчно, однако чревато потерей драгоценных четырёх байт, а также одним лишним присвоением при обращении к классу. Более того, могут возникнуть трудноловимые ерроры при разыменовании. Скажем, первый поинтер ты разыменовал, и надеешься увидеть в полученной области памяти структуру класса. Пробуешь читать... И ловишь AV, ибо там не класс, а лишь второй поинтер, по которому ышшо надо лишний раз перейти.


 
Kolan ©   (2008-01-11 18:46) [6]

> конечно быстрее&#133 через попу ухо пяткой чесать всегда быстрее)

И главное понятнее :)


 
Dan   (2008-01-11 18:53) [7]

Понятно! А с рекордами та же каша?


 
Правильный_Вася   (2008-01-11 18:54) [8]


> через попу ухо пяткой чесать всегда быстрее

это называется инкапсуляция


 
Palladin ©   (2008-01-11 18:55) [9]

нет конечно, идентификатор recordа в памяти имеет ту же структуру что и описана (хотя конечно есть различия между packed и не packed)


 
Dan   (2008-01-11 18:59) [10]


> Palladin ©

Значит с рекордами лучше работать через указатель? Или нет?


 
Palladin ©   (2008-01-11 19:02) [11]

ну ты интересный вопрос спросил... он настолько широкий, что кроме того, что: все это зависит от ситуации и задачи, я тебе ничего ответить не могу...


 
WMZ   (2008-01-11 19:05) [12]


> Palladin ©

Хорошо! Если рекорд большой(т.б. внутри присутсвуют переменный типа Byte, String, Integer, Double, различные массивы и пр.) значит через указатели, иначе - нет.
Так?


 
Kolan ©   (2008-01-11 19:06) [13]

Что тебе надо сделать объясни&#133


 
Palladin ©   (2008-01-11 19:07) [14]


> [12] WMZ   (11.01.08 19:05)

нет не так, от размера рекорда ничего не зависит


 
Юрий Зотов ©   (2008-01-11 19:07) [15]

> WMZ   (11.01.08 19:05) [12]

Тоже зависит от ситуации. Размер записи сам по себе ничего не определяет.


 
Джо ©   (2008-01-11 19:08) [16]

> [12] WMZ   (11.01.08 19:05)
>
> > Palladin ©
>
> Хорошо! Если рекорд большой(т.б. внутри присутсвуют переменный
> типа Byte, String, Integer, Double, различные массивы и
> пр.) значит через указатели, иначе - нет.
> Так?

От того, что ты заведешь указатель на что бы то ни было, быстрее ничего не станет. Откуда такие странные представления вообще?


 
Dan   (2008-01-11 19:09) [17]

Мне нужно, понять, когда лучше работать с указателями(record), а когда - напрямую.


 
Джо ©   (2008-01-11 19:11) [18]

> [17] Dan   (11.01.08 19:09)
> Мне нужно, понять, когда лучше работать с указателями(record)
> , а когда - напрямую.

Когда нужно выделять память под запись динамически, тогда и нужно использовать указатель. Остальные случаи слишком специфичны, чтобы их тут обсуждать.


 
{RASkov} ©   (2008-01-11 19:12) [19]

> [12] WMZ   (11.01.08 19:05)

Смотря что ты с этим рекордом делать будешь.... если просто читать и/или менять его составные то нет смысла в указателях....

Указатель чем отличается от переменной не указателя (например рекорд) ?
Да, да... указатель он всегда 4 байта.... поэтому сортировка данных, например в массиве, быстрее организовать с указателями...., чем реальные, большого размера, данные перекладывать в памяти с места на место..... Вот и думай когда быстрее указатель, а когда от него нет толку....
И вообще они остались для совместимости :)


 
{RASkov} ©   (2008-01-11 19:12) [20]

Блин.... как здесь быстро отвечают :)


 
Dib@zol ©   (2008-01-11 19:12) [21]

> Значит с рекордами лучше работать через указатель? Или нет?

А вот тут как раз моногенитально, как с ним работать. Но опять же если работать через указатели, то имеем одно лишнее присвоение.

ЗЫ а если уж так хочется попробовать поработать с указателями, попробуй сгенерировать хотя бы шестнадцативершинный граф со случайными связями (макс. 4 шт. на один узел) и попытаться найти в этом графе циклический маршрут.


 
Dan   (2008-01-11 19:18) [22]

Ладно! Всем спасибо за ответы.



Страницы: 1 вся ветка

Текущий архив: 2008.02.03;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.018 c
1-1193230015
pasha_golub
2007-10-24 16:46
2008.02.03
Не могу зайти дебаггером в исходники DBClient.pas


15-1198324676
Kostafey
2007-12-22 14:57
2008.02.03
К вопросу о культурном проектировании реляционных БД


2-1199450070
Stas
2008-01-04 15:34
2008.02.03
Вставка результата запроса из DBF в MSSQL


2-1199652797
петрович07
2008-01-06 23:53
2008.02.03
менять строки местами в двумерном массиве


15-1198957647
Cyrax
2007-12-29 22:47
2008.02.03
Что такое .izp ?