serbod писал(а):Для переменных со счетчиком ссылок (array, string, object) используется "copy-on-write
Нет, не так.


Модератор: Модераторы
serbod писал(а):Для переменных со счетчиком ссылок (array, string, object) используется "copy-on-write
Для переменных со счетчиком ссылок (array, string, object) используется "copy-on-write
Дож писал(а):serbod, хватит писать одну и ту же ерунду: у object'ов нет счётчика ссылок и никогда не было.
olegy123 писал(а):Объясните мне пожалуйста политику работы в паскале с указателями.
вот пример
http://www.delphibasics.ru/PInt64.php
- Код: Выделить всё
var
int64Ptr : PInt64;
a : TDateTime;
begin
// Ассигнование памяти для трёх Int64 переменных
GetMem(int64Ptr, 3 * SizeOf(Int64));
// Заполнение этих переменных значениями
int64Ptr^ := 1;
Inc(int64Ptr);
int64Ptr^ := 22;
Inc(int64Ptr);
int64Ptr^ := 333;
// Показ этих значений
Dec(int64Ptr, 2);
ShowMessageFmt('Значение 1 = %d',[int64Ptr^]);
Inc(int64Ptr);
ShowMessageFmt('Значение 2 = %d',[int64Ptr^]);
Inc(int64Ptr);
ShowMessageFmt('Значение 3 = %d',[int64Ptr^]);
end;
var VInt64: array of Int64;
begin
// Выделение памяти для трёх Int64 переменных
SetLength(VInt64, 3);
// Заполнение этих переменных значениями
VInt64[0] := 1;
VInt64[1] := 22;
VInt64[2] := 333;
// Показ этих значений
ShowMessageFmt('Значение 1 = %d', VInt64[0]);
ShowMessageFmt('Значение 2 = %d', VInt64[1]);
ShowMessageFmt('Значение 3 = %d', VInt64[2]);
// Освобождение памяти
SetLength(VInt64, 0);
end;
Ichthyander писал(а):Лекс Айрин и покажите мне пример "серьезного" проекта, где с объектами активно работают именно так. К примеру, из кода fpc или Lazarus
serbod писал(а):Дож писал(а):serbod, хватит писать одну и ту же ерунду: у object'ов нет счётчика ссылок и никогда не было.
Блин, точно. Жаль, очень жаль.
Добавлено спустя 15 минут 31 секунду:
Однако, непонятка. В Reference Guide в разделе Managed Types:
<...>
And any record or array whose elements contain managed types.
type
TManagedObject = object
S: AnsiString;
end;
procedure Func;
var
M: TManagedObject;
begin
// Здесь компилятор вставит инициализацию M.S, потому что если этого не сделать,
// то в M.S будет лежать мусор, что приведёт к падению программы при любом обращении
// к M.S как к строке
M.S := 'init value'; // даже таком
end;
Дож писал(а):Managed не означает "подсчёт ссылок"
type TMList = array [0..9] of record
name: string;
tag: Integer;
end;
procedure Test;
var l: TMList;
begin
...
//здесь счетчик ссылок для каждой l.name[i] будет уменьшен на единицу
end.
var
pI:PInteger;
..
for pI^:=0 to 100 do..
Mikhail писал(а):Дож писал(а):Managed не означает "подсчёт ссылок"
Означает, но не для record-а
The following types are managed:
AnsiString - They are initialized to Nil.
UnicodeString - They are initialized to Nil.
WideString - They are initialized to Nil.
Interface - They are initialized to Nil.
Dynamic arrays - They are initialized to Nil.
And any record or array whose elements contain managed types.
olegy123 писал(а):Еще можно вопросик о кодогенерации.
почему я не могу сделать такполучаю Error: Illegal counter variable на for pI^
- Код: Выделить всё
var
pI:PInteger;
..
for pI^:=0 to 100 do..
я конечно, понимаю, что counter variable скорее будет в регистре CPU, но вопрос такой? а если у меня будет for..do больше количества регистров, где данные будет циклов будут сохранятся.
olegy123 писал(а):где данные будет циклов будут сохранятся.
olegy123 писал(а):получаю Error: Illegal counter variable на for pI^
я конечно, понимаю, что counter variable скорее будет в регистре CPU, но вопрос такой? а если у меня будет for..do больше количества регистров, где данные будет циклов будут сохранятся
Ichthyander писал(а):покажите мне пример "серьезного" проекта, где с объектами активно работают именно так
Лекс Айрин писал(а):Это компилятор дает по рукам, так как не может проверить
iskander писал(а):Это синтаксически неправильная конструкция.
Лекс Айрин писал(а):Только вот не каждый поймет почему. Проще принять как аксиому
Вернуться в Free Pascal Compiler
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0