Расшаренные ссылки на объекты

Обсуждаются как существующие проекты (перевод документации, информационная система и т.п.), так и создание новых.

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

zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Сомневаюсь что на этапе компиляции можно отследить динамически регистрируемые и динамически создаваемые сущности, такие ошибки обычно очень нетривиальны.
А Form1:=TForm.create сделал, но Form1.free забыл - это и не ошибка имхо, так, опечатка
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Сообщение Дож »

Сомневаюсь что на этапе компиляции можно отследить динамически регистрируемые и динамически создаваемые сущности

Динамически создаваемые сущности компилятор может отследить при помощи умных указателей. Программисту нужно правильно выбрать тип умного указателя, соответствующий тому, как он дальше будет использоваться.

А Form1:=TForm.create сделал, но Form1.free забыл - это и не ошибка имхо, так, опечатка

Так это же аргумент в пользу того, что отлавливать такое -- работа компилятора, а не высококвалифицированного программиста :)
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>Так это же аргумент в пользу того, что отлавливать такое -- работа компилятора, а не высококвалифицированного программиста :)
из пушки по воробьям

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

Добавлено спустя 2 минуты 28 секунд:
зы. ниче не имею против новых фич в компиляторе - лишь бы они старому не мешали
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Сообщение Дож »

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

Утечек было бы столько же, если бы вы не использовали паскалевские строки вообще, а все их выделяли руками через GetMem/FreeMem?
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

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

Сообщение Дож »

Почему Management Operators -- ненормальная возможность?
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

zub писал(а):Пожалуй я сольюсь из спора.появится нормальная возможность реализации хитрых указателей - посмотрим

zub, погоди сливаться, я когда-то(года три назад?) использовал что-то вроде этого:

Код: Выделить всё

type

  generic TAutoShared<T: class> = record
  private
  type
  {$push}{$interfaces com}
    IOwner = interface
      function  GetInstance: T;
    end;
  {$pop}
    TOwner = class(TInterfacedObject, IOwner)
    protected
      FInstance: T;
      function  GetInstance: T;
    public
      constructor Create;
      constructor Create(aInst: T);
      destructor Destroy; override;
    end;
  var
    FOwner: IOwner;
    function GetInstance: T; inline;
    procedure SetInstance(aValue: T); inline;
  public
    class operator :=(var s: TAutoShared): T; inline;
    class operator Explicit(var s: TAutoShared): T; inline;
    procedure Release; inline;
    property Instance: T read GetInstance write SetInstance;
  end;

implementation

{ TAutoShared.THolder }

function TAutoShared.TOwner.GetInstance: T;
begin
  Result := FInstance;
end;

constructor TAutoShared.TOwner.Create;
begin
  FInstance := T.Create;
end;

constructor TAutoShared.TOwner.Create(aInst: T);
begin
  FInstance := aInst;
end;

destructor TAutoShared.TOwner.Destroy;
begin
  FInstance.Free;
  inherited;
end;

{ TAutoShared }

function TAutoShared.GetInstance: T;
begin
  if FOwner = nil then
    FOwner := TOwner.Create;
  Result := FOwner.GetInstance;
end;

procedure TAutoShared.SetInstance(aValue: T);
begin
  if aValue <> Default(T) then
    begin
      if (FOwner <> nil) and (aValue = FOwner.GetInstance) then exit;
      FOwner := TOwner.Create(aValue)
    end
  else
    FOwner := nil;
end;

class operator TAutoShared.:=(var s: TAutoShared): T;
begin
  Result := s.Instance;
end;

class operator TAutoShared.Explicit(var s: TAutoShared): T;
begin
  Result := s.Instance;
end;

procedure TAutoShared.Release;
begin
  FOwner := nil;
end;

Что в ней тебе не нравится?(Набросал по памяти, могут быть и ошибки, сейчас пользуюсь библиотечной)
sts
энтузиаст
Сообщения: 519
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Сообщение sts »

Mikhail писал(а):Проблема даже не в том что нужно переделать компилятор, а в том что нужно еще все библиотеки и существующий на Паскале софт переделать.

Это не проблема это задача.
Без этого нет смысла в развитии языка, вон добавили дженерики и что? где TComboBox<TMyObject>.Items<T> (или как там)?.
Нужно так развивать язык чтоб он качественно улучшал разработку, уже давно очевидно что без переписывания не обойтись а значит новые возможности должны упрощать переписывание, вместо страницы кода один вызов функции и прогеры с радостью перепишут.
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>Почему Management Operators -- ненормальная возможность?
Убедился что появились в 3.2 не знал

>>Что в ней тебе не нравится?
Интерфейсы

Добавлено спустя 1 минуту 50 секунд:
>>Нужно так развивать язык чтоб он качественно улучшал разработку
Паскаль это паскаль. Тебе придется придумать чтото новое, на базе
sts
энтузиаст
Сообщения: 519
Зарегистрирован: 04.04.2008 12:15:44
Откуда: Тольятти

Сообщение sts »

в паскале не было классов и интерфейсов и ничего в припрыжку перешли на них
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

zub писал(а):Интерфейсы

Та приблуда, которой сейчас пользуюсь, примерно то же самое с заменой интерфейса на Management Operators.
Разница в производительности ~30%, по памяти не считал.
sts писал(а):Без этого нет смысла в развитии языка, вон добавили дженерики и что? где TComboBox<TMyObject>.Items<T> (или как там)?.

Генерики(по крайней мере в текущем состоянии) в сочетании с виртуальными методами это та ещё субстанция.
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

Посмотрел примеры Management Operators
Насколько я понял поведение "аля стринг" на них не реализовать(( и стринги не переписать на этой фиче внутри компилятора - компиляторные managed типы так и останутся магическими((

Добавлено спустя 1 минуту 23 секунды:
>>в паскале не было классов и интерфейсов и ничего в припрыжку перешли на них
это новые фичи, старый код вполне работает без них

Добавлено спустя 2 минуты 12 секунд:
>>Насколько я понял поведение "аля стринг" на них не реализовать((
имею ввиду служебную инфу по отрицательному смещению и возможность использовать как указатель непосредственно на данные
iskander
энтузиаст
Сообщения: 627
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Эта фича осталась недоделанной, но Copy On Write на ней организовать вполне можно.
Аватара пользователя
Дож
энтузиаст
Сообщения: 900
Зарегистрирован: 12.10.2008 16:14:47

Сообщение Дож »

имею ввиду служебную инфу по отрицательному смещению и возможность использовать как указатель непосредственно на данные

Ужас :) Можно же написать у своих строк методы .GetHackedInfo и .GetRawPtr и это повысит читабельность кода, разве нет?
zub
долгожитель
Сообщения: 2889
Зарегистрирован: 14.11.2005 22:51:26
Контактная информация:

Сообщение zub »

>>Можно же написать у своих строк
Можно.
А стринги на них переписать - нет
Ответить