Текущий архив: 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]> конечно быстрее… через попу ухо пяткой чесать всегда быстрее)
И главное понятнее :)
← →
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]Что тебе надо сделать объясни…
← →
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.49 MB
Время: 0.047 c