Что делают различные записи типов элементов в TypeData для динамических массивов?

Поле TTypeData, содержащее RTTI для разных типов данных, имеет три разных значения типа элемента для динамического массива:

elType: PPTypeInfo;       // nil if type does not require cleanup
elType2: PPTypeInfo;      // independent of cleanup
DynArrElType: PPTypeInfo; // actual element type, even if dynamic array

Назначение elType довольно ясно: оно используется FinalizeArray в RTL и оставлено nil, если нечего дорабатывать. Но затем у нас есть два других элемента, elType2 и DynArrElType. Кто-нибудь знает, почему их два и в чем разница между ними?


person Mason Wheeler    schedule 02.12.2011    source источник
comment
Я просто проверяю, и поле DynArrElType: PPTypeInfo; появляется закомментированным в Delphi XE и XE2, а в старых версиях, таких как Delphi 7 - 2007, даже не появляется. Какую версию делфи вы используете?   -  person RRUZ    schedule 03.12.2011
comment
TypInfo.pas использует комментарии для описания данных переменной длины, которые не могут быть объявлены статически в определениях записей. Тот факт, что он прокомментирован в более новых версиях, а не в более старых версиях, означает, что в более новых версиях присутствуют новые данные.   -  person Remy Lebeau    schedule 03.12.2011
comment
@RemyLebeau-TeamB приятно это знать, но в вопросе Мэйсона поле не отображается закомментированным, поэтому это может привести к путанице.   -  person RRUZ    schedule 03.12.2011
comment
@RRUZ: Это довольно сложный вопрос, и я действительно ищу ответы только от людей, которые знают систему достаточно подробно, чтобы они понимали такие вещи и не запутались в этом.   -  person Mason Wheeler    schedule 03.12.2011
comment
@MasonWheeler, это звучит грубо. Я надеюсь, что вы найдете таких людей и ответы, которые вы ищете здесь. Извините, что не соответствую вашим высоким стандартам. Я думал удалить свой ответ после прочтения вашего комментария, но я сохраню его, просто потому, что он может помочь кому-то еще в будущем.   -  person RRUZ    schedule 03.12.2011
comment
@MasonWheeler: тот факт, что кто-то может не знать систему в деталях, не должен отговаривать их от ответов на вопросы. Я сам хорошо разбираюсь во внутренней работе RTL и VCL, но я никогда не видел, чтобы эти конкретные поля использовались на практике, и мне потребовалось всего несколько секунд, чтобы просмотреть код поиска RTL, чтобы увидеть, что он использует только elType поле. Если вам нужны ответы только от знающих людей, направляйте свои вопросы напрямую Аллену Бауэру и другим членам команд разработчиков IDE/компиляторов.   -  person Remy Lebeau    schedule 03.12.2011
comment
@Remy: Это не так просто, как grep, особенно с полями комментариев после строки. Взгляните, например, на GetDynArrayElType в Rtti.pas. Кажется очевидным, что DynArrElType был добавлен в D2010 для поддержки расширенной системы RTTI. Пытаюсь понять, чем он отличается от elType2, который уже был.   -  person Mason Wheeler    schedule 03.12.2011


Ответы (2)


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

{$APPTYPE CONSOLE}

uses
  TypInfo,
  SysUtils;

type
 TDateArray = array of TDateTime;
Var
  p      : PPTypeInfo;
begin
  try
     p:=TypInfo.GetTypeData(TypeInfo(TDateArray)).elType2;
     Writeln(TypInfo.GetTypeName(p^));
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.

Это вернет TDateTime, который является типом элементов типа TDateArray.

Кстати, поле DynArrElType было заменено в последних версиях delphi на DynUnitName: ShortStringBase

person RRUZ    schedule 02.12.2011
comment
Основываясь на комментариях, я ожидал, что DynArrElType будет содержать информацию о типе элемента, а не elType2. Кроме того, согласно TypInfo.pas XE2, DynArraElType все еще существует даже при наличии DynUnitName. - person Remy Lebeau; 03.12.2011
comment
Кстати, DynUnitName существует как минимум с D6 и всегда следовал сразу после elType2. - person Remy Lebeau; 03.12.2011
comment
да. Я пропустил несколько элементов, потому что они не имели отношения к вопросу. - person Mason Wheeler; 03.12.2011

Насколько я могу судить, elType2 и DynArrElType RTL ни для чего не использует. Компилятор может выдавать эти значения просто как дополнительные метаданные, возможно, для генераторов документации и т.п.

person Remy Lebeau    schedule 02.12.2011