Типы данных

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Re: Типы данных

Сообщение Mikhail » 05.12.2017 00:09:38

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


Нет, не так. :) Для объектов (class) в FPC, вроде счетчики ссылок еще не прикрутили, а copy on write работает только для Ansi-Unicode и т.п. string, массивы всегда нужно вручную копировать. Ну и не забываем, что есть еще перегрузка операторов. :)
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: Типы данных

Сообщение serbod » 05.12.2017 00:32:43

Блин, и правда - Dynamic arrays are reference counted: assignment of one dynamic array-type variable to another will let both variables point to the same array. Contrary to ansistrings, an assignment to an element of one array will be reflected in the other: there is no copy-on-write.

Вот нахрена так сделали, только еще больше все запутали.

Добавлено спустя 2 минуты 51 секунду:
Although writing to elements of dynamic arrays does not create a new instance of the array (no copy-on-write as it exists for Ansistrings) using SetLength on such arrays does create a copy!

Ну ёпта, это уже издевательство!
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Типы данных

Сообщение Дож » 05.12.2017 03:28:51

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

serbod, хватит писать одну и ту же ерунду: у object'ов нет счётчика ссылок и никогда не было.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Типы данных

Сообщение serbod » 05.12.2017 04:11:35

Дож писал(а):serbod, хватит писать одну и ту же ерунду: у object'ов нет счётчика ссылок и никогда не было.

Блин, точно. Жаль, очень жаль.

Добавлено спустя 15 минут 31 секунду:
Однако, непонятка. В Reference Guide в разделе Managed Types:
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.
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Типы данных

Сообщение sign » 05.12.2017 07:28:00

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;
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Типы данных

Сообщение Лекс Айрин » 05.12.2017 09:32:52

Ichthyander писал(а):Лекс Айрин и покажите мне пример "серьезного" проекта, где с объектами активно работают именно так. К примеру, из кода fpc или Lazarus


Это вряд ли. Дело в том, что использовать классические объекты сейчас не модно. Да и редко когда оправдано.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Типы данных

Сообщение Дож » 05.12.2017 09:55:26

serbod писал(а):
Дож писал(а):serbod, хватит писать одну и ту же ерунду: у object'ов нет счётчика ссылок и никогда не было.

Блин, точно. Жаль, очень жаль.

Добавлено спустя 15 минут 31 секунду:
Однако, непонятка. В Reference Guide в разделе Managed Types:
<...>
And any record or array whose elements contain managed types.

Managed не означает "подсчёт ссылок", оно означает, что компилятор неявно добавляет дополнительный код по работе с типом. Например,
Код: Выделить всё
type
TManagedObject = object
  S: AnsiString;
end;

procedure Func;
var
  M: TManagedObject;
begin
  // Здесь компилятор вставит инициализацию M.S, потому что если этого не сделать,
  // то в M.S будет лежать мусор, что приведёт к падению программы при любом обращении
  // к M.S как к строке
  M.S := 'init value'; // даже таком
end;
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Типы данных

Сообщение Mikhail » 05.12.2017 11:17:28

Дож писал(а):Managed не означает "подсчёт ссылок"


Означает, но не для record-а, а для его полей, которые используют счетчик ссылок, т.е. происходит как бы вызов деструктора для record-a, при выходе из области видимости. По поля использующие подсчет ссылок инициализируются nil. Для object-а это тоже, вроде, используется... хотя не уверен.

Добавлено спустя 8 минут 36 секунд:
Т.е, например
Код: Выделить всё
type TMList = array [0..9] of record
         name: string;
         tag: Integer;
        end;

procedure Test;
var l: TMList;
begin
...
//здесь  счетчик ссылок для каждой l.name[i] будет уменьшен на единицу
end.

Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: Типы данных

Сообщение olegy123 » 05.12.2017 12:34:31

Еще можно вопросик о кодогенерации.

почему я не могу сделать так
Код: Выделить всё
var
    pI:PInteger;
..
  for pI^:=0 to 100 do..
получаю Error: Illegal counter variable на for pI^
я конечно, понимаю, что counter variable скорее будет в регистре CPU, но вопрос такой? а если у меня будет for..do больше количества регистров, где данные будет циклов будут сохранятся.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Типы данных

Сообщение Дож » 05.12.2017 12:45:16

Mikhail писал(а):
Дож писал(а):Managed не означает "подсчёт ссылок"


Означает, но не для record-а

Перепродчтите цитату из Reference Guide, приведённую выше :)
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.


Добавлено спустя 11 минут 26 секунд:
olegy123 писал(а):Еще можно вопросик о кодогенерации.

почему я не могу сделать так
Код: Выделить всё
var
    pI:PInteger;
..
  for pI^:=0 to 100 do..
получаю Error: Illegal counter variable на for pI^
я конечно, понимаю, что counter variable скорее будет в регистре CPU, но вопрос такой? а если у меня будет for..do больше количества регистров, где данные будет циклов будут сохранятся.

Не можете так сделать, потому что это требование компилятора к программе (переменная-счётчик для for-to цикла должна быть локальной к текущему телу).

Не все счётчики размещаются в регистрах, какие-то будут на стеке.
Аватара пользователя
Дож
энтузиаст
 
Сообщения: 899
Зарегистрирован: 12.10.2008 16:14:47

Re: Типы данных

Сообщение Mikhail » 05.12.2017 13:00:01

olegy123 писал(а):где данные будет циклов будут сохранятся.


В стеке, разумеется.
Mikhail
энтузиаст
 
Сообщения: 562
Зарегистрирован: 24.10.2013 16:06:47

Re: Типы данных

Сообщение Лекс Айрин » 05.12.2017 13:02:06

olegy123 писал(а):получаю Error: Illegal counter variable на for pI^
я конечно, понимаю, что counter variable скорее будет в регистре CPU, но вопрос такой? а если у меня будет for..do больше количества регистров, где данные будет циклов будут сохранятся


Это компилятор дает по рукам, так как не может проверить (на этапе компиляции) что находится за ссылочной переменной и существует ли она вообще.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Типы данных

Сообщение iskander » 05.12.2017 16:01:55

Ichthyander писал(а):покажите мне пример "серьезного" проекта, где с объектами активно работают именно так

Библиотека KOL.
Лекс Айрин писал(а):Это компилятор дает по рукам, так как не может проверить

Это синтаксически неправильная конструкция.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: Типы данных

Сообщение Лекс Айрин » 05.12.2017 16:59:48

iskander писал(а):Это синтаксически неправильная конструкция.


Безусловно. Только вот не каждый поймет почему. Проще принять как аксиому, что ссылочные типы играют по другим правилам.
Аватара пользователя
Лекс Айрин
долгожитель
 
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград

Re: Типы данных

Сообщение iskander » 05.12.2017 17:10:25

Лекс Айрин писал(а):Только вот не каждый поймет почему. Проще принять как аксиому

Так открой нам эту жгучую тайну, не нужно никаких аксиом.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Пред.След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru