Войти
ПрограммированиеФорумОбщее

Реализация вектора в Delphi

Страницы: 1 2 Следующая »
#0
15:09, 4 авг. 2009

Не сочтите за наивность или глупость. В голове крутится два варианта реализации вектора, уже давно не могу определиться, какой выбрать.

type
  TmtArray3f = array[0..2] of Single;

  TmtVector3f_1 = packed record
  private
    function GetItem(Index: Integer): Single; inline;
    procedure SetItem(Index: Integer; const Value: Single); inline;
  public
    // Разные методы
    property Item[Index: Integer]: Single read GetItem write SetItem; default;
    case Integer of
      0: (X: Single;
          Y: Single;
          Z: Single);
      1: (V: TmtArray3f);
  end;

  TmtVector3f_2 = packed record
  private
    FBytes: packed record
      case Byte of
        0: (X: Single;
            Y: Single;
            Z: Single);
        1: (V: TmtArray3f);
      end;
  private
    function GetItem(Index: Integer): Single; inline;
    procedure SetItem(Index: Integer; const Value: Single); inline;
  public
    property X: Single read FBytes.X write FBytes.X;
    property Y: Single read FBytes.Y write FBytes.Y;
    property Z: Single read FBytes.Z write FBytes.Z;
    property V[Index: Integer]: Single read GetItem write SetItem; default;
    // Разные методы
  end;

function TmtVector3f_1.GetItem(Index: Integer): Single;
begin
  Result := V[Index];
end;

procedure TmtVector3f_1.SetItem(Index: Integer; const Value: Single);
begin
  V[Index] := Value;
end;

function TmtVector3f_2.GetItem(Index: Integer): Single;
begin
  Result := FBytes.V[Index];
end;

procedure TmtVector3f_2.SetItem(Index: Integer; const Value: Single);
begin
  FBytes.V[Index] := Value;
end;

По идее, TmtVector3f_1 предпочтительнее использовать почти по всем показателям, кроме разве что того, что в списке свойств и методов  (вызываемый по нажатию Ctrl + Пробел), свойства X, Y, Z и V отображаются в самом низу, согласитесь, как-то это не правильно. Стал исправлять ситуацию, сделал вторую реализацию вектора TmtVector3f_2, по сути, почти тоже самое. Стал тестить, написал такой код и посмотрел в CPU:

var v1: TmtVector3f_1;
    v2: TmtVector3f_2;
begin
  v1.X    := 1;         // mov [ebp-$0c],$3f800000
  v1.V[0] := 2;         // mov [ebp-$0c],$40000000
  v1[0]   := 3;         // xor eax,eax          mov [ebp+eax*4-$0c],$40400000

  v2.X    := 1;         // mov [ebp-$18],$3f800000
  v2.V[0] := 2;         // xor eax,eax          mov [ebp+eax*4-$18],$40000000
  v2[0]   := 3;         // xor eax,eax          mov [ebp+eax*4-$18],$40400000

  v1.Y    := 4;         // mov [ebp-$08],$40800000
  v1.V[1] := 5;         // mov [ebp-$08],$40a00000
  v1[1]   := 6;         // mov eax,$00000001    mov [ebp+eax*4-$0c],$40c00000

  v2.Y    := 4;         // mov [ebp-$14],$40800000
  v2.V[1] := 5;         // mov eax,$00000001    mov [ebp+eax*4-$18],$40a00000
  v2[1]   := 6;         // mov eax,$00000001    mov [ebp+eax*4-$18],$40c00000

Как видно, отличия всеже есть
Смущает то, что компилятор для

v1[0] := 3;
и ему подобных, сделал так:
xor eax,eax          
mov [ebp+eax*4-$0c],$40400000
Что вообще означает запись?:
ebp+eax*4-$0c
Это реально будет выполняться столько операций (умножение, сложение и вычитание)? или же это одна операция?
Почему компилятор сразу не сделал так?:
mov [ebp-$0c],$40400000
ведь видно же, что в eax 0 лежит.

И прошу прощения за длинный вопрос.


#1
15:25, 4 авг. 2009

>>Это реально будет выполняться столько операций (умножение, сложение и вычитание)? или же это одна операция?
Это одна операция вычисления адреса

>>Почему компилятор сразу не сделал так?:
Не знаю. Напиши на асме.

Там в принципе

mov eax,$00000001    mov [ebp+eax*4-$18],$40a00000

можно написать как

mov [ebp-$14],$40a00000

#2
15:43, 4 авг. 2009

murder
> Там в принципе
> mov eax,$00000001 mov [ebp+eax*4-$18],$40a00000
> можно написать как
> mov [ebp-$14],$40a00000
Дак и я про тоже, нафиг он понапихал лишних xor и mov.

#3
17:34, 4 авг. 2009

louken
Видимо не включена оптимизация в компиляторе дельфи.
Пользуясь случаем хочу передать привет опциям компилера из секции оптимизаций. Всем привет!

#4
17:50, 4 авг. 2009

в GLScene www.glscene.org есть готовый мощный модуль векторной и матричной алгебры с оптимизированными ассмблерными функциями. Можно пользоваться или брать за образцы.

#5
17:51, 4 авг. 2009

Ну дак включена она, конечно же. Там она, посути, всего-то одна - Optimization - On/Off

#6
17:57, 4 авг. 2009

pool2004
> в GLScene www.glscene.org есть готовый мощный модуль векторной и матричной
> алгебры с оптимизированными ассмблерными функциями. Можно пользоваться или
> брать за образцы.
Я и так от туда половину своего модуля скопипастил. Правда из старой версии. Там, кстати, ничего нового не появилось, с поддержкой новых Delphi, типа векторов с поддержкой переопределения операторов?

#7
20:24, 4 авг. 2009

louken
> Там, кстати, ничего нового не появилось, с поддержкой новых Delphi, типа
> векторов с поддержкой переопределения операторов?
Насколько знаю - нет. Да и зачем ломать то, что и так хорошо работает? Переопределение операторов - дорогостоящая, в смысле временных затрат, вещь.

#8
22:14, 4 авг. 2009

pool2004
> Да и зачем ломать то, что и так хорошо работает?
чтоб работало отлично :) шутка. :-D

#9
22:17, 4 авг. 2009

кстати, почему их нельзя заинлайнить? ведь тип аргументов известен заранее

#10
8:48, 5 авг. 2009

pool2004
> Насколько знаю - нет. Да и зачем ломать то, что и так хорошо работает?
> Переопределение операторов - дорогостоящая, в смысле временных затрат, вещь.

не говоря уж о том, что в дельфи реализация перегрузки операторов для классов невозможна.

#11
9:47, 5 авг. 2009

Mega
> не говоря уж о том, что в дельфи реализация перегрузки операторов для классов
> невозможна.
Я не использую перегрузки операторов, но по help`у, она делается на уровне типов переменных.  А что может означать перегрузка операторов для классов, мне непонятно. С классами ИМХО работают операторы as и is.

#12
11:52, 5 авг. 2009

pool2004
> Я не использую перегрузки операторов, но по help`у, она делается на уровне
> типов переменных. А что может означать перегрузка операторов для классов, мне
> непонятно. С классами ИМХО работают операторы as и is.

не знаю, что там к сегодняшнему дню наколбашено в дельфи, но вот примерно такое там невозможно:

type
   x = class
      // class declaration here
   end;

operator+(lhs: x; rhs:x):x;
#13
13:39, 5 авг. 2009

Mega
Дык у автора вектора - это рекорды, а не классы...

#14
13:49, 5 авг. 2009

Mega
> но вот примерно такое там невозможно

возможно в D2009 для классов унаследованных от TPublishableVariantType.
пример есть для комплексных чисел - модуль VarCmplx

Страницы: 1 2 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.