Вопросы по ООП в MQL5 - страница 88

 
Igor Makanu:
такие же значения, скорость теста почему то "плавает", но передача параметров в методах по ссылке все равно эффективнее

Тогда ещё такой вариант:

class E
{
   double f1( double a, double b )  { return(a + 1.0/(1.0+(double)rand())); }
   double f2( double a, double b )  { return(b + 1.0/(1.0+(double)rand())); }
   double f3( double a, double b )  { return(a/b + 1.0/(1.0+(double)rand())); }
   
public:
   double calc( const MqlTick& tick )
   {
      return f1( tick.ask, tick.bid ) + f2( tick.ask, tick.bid ) + f3( tick.ask, tick.bid );
   }
};
 
Koldun Zloy:

Тогда ещё такой вариант:

2020.07.26 10:10:52.254 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46141

2020.07.26 10:11:30.261 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38000

2020.07.26 10:12:08.258 class_global (EURUSD,H1) class C : : loops = 10000000000 ms=38000

2020.07.26 10:12:46.254 class_global (EURUSD,H1) class D : : loops = 10000000000 ms=38000

2020.07.26 10:13:24.279 class_global (EURUSD,H1) class E : : loops = 10000000000 ms=38031

2020.07.26 10:14:10.484 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46203

2020.07.26 10:14:48.570 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38078

2020.07.26 10:15:26.737 class_global (EURUSD,H1) class C : : loops = 10000000000 ms=38172

2020.07.26 10:16:04.734 class_global (EURUSD,H1) class D : : loops = 10000000000 ms=38000

2020.07.26 10:16:42.739 class_global (EURUSD,H1) class E : : loops = 10000000000 ms=38000

2020.07.26 10:17:28.886 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46141

2020.07.26 10:18:06.894 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38015

2020.07.26 10:18:44.888 class_global (EURUSD,H1) class C : : loops = 10000000000 ms=38000

2020.07.26 10:19:22.948 class_global (EURUSD,H1) class D : : loops = 10000000000 ms=38047

2020.07.26 10:20:00.983 class_global (EURUSD,H1) class E : : loops = 10000000000 ms=38047

странно, но разницы нет

UPD: ксли не ошибаюсь, то прау лет назад искал ошибку в МТ4 - передавал аргументы в функцию НЕ по ссылке, и потом в теле функции изменял ( накосячил ) один из аргументов ф-ции, дык можно было изменить аргумент переданный не по ссылке, может быть и в варианте Е компилятор передает по ссылке все аргументы

 
Igor Makanu:
странно, но разницы нет

Ничего странного. double - 8 байт, ссылка тоже 8 байт. Но по ссылке ещё нужно достать 8 байт числа.

 
Koldun Zloy:

Ничего странного. double - 8 байт, ссылка тоже 8 байт. Но по ссылке ещё нужно достать 8 байт числа.

так то логично, и цифры сходятся 8 туда и 8 обратно ))

но шина же не 8 бит у процессора? должен же за такт прочитать 8 байт = 64 бит ?

 
Igor Makanu:

так то логично, и цифры сходятся 8 туда и 8 обратно ))

но шина же не 8 бит у процессора? должен же за такт прочитать 8 байт = 64 бит ?

Там не всё так просто. Скорость зависит и от того в какой памяти находится объект и от других причин.

В реальной программе результат может сильно отличаться от результата простого теста.

По ссылке обычно передают классы и структуры.

Простые типы передают по ссылке, только если через неё возвращается какое-то значение.

 

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

такой код работает правильно (заполняем структуру в ф-ции, затем копируем результат функции в байтовый массив)

struct UcharArray
{
   uchar             byte[];
};
//+------------------------------------------------------------------+
UcharArray f()
{
   UcharArray result;
   for(uchar i = 0; i < 10; i++)
   {
      uchar tmp[1];
      tmp[0] = i;
      ArrayCopy(result.byte, tmp, ArraySize(result.byte));
   }
   return result;
}
//+------------------------------------------------------------------+
void OnStart()
{
   uchar arr[];
   for(int i = 0; i < 3; i++)
   {
      ArrayCopy(arr, f().byte, ArraySize(arr));
   }
   
   ArrayPrint(arr); // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9

}
//+------------------------------------------------------------------+

пользоваться довольно удобно таким доступом к полю структуры ,.... где могут быть подводные камни - баги/ошибки ?

 
Igor Makanu:

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

такой код работает правильно (заполняем структуру в ф-ции, затем копируем результат функции в байтовый массив)

пользоваться довольно удобно таким доступом к полю структуры ,.... где могут быть подводные камни - баги/ошибки ?

Эта типа фишка)) багов нету. 

 ArrayCopy(arr, (f()).byte, ArraySize(arr))

Так более верно это из оперы (.)(.)

Так же не понял причем тут копирование в байтовый масив. Тут же просто обращения к даным возвращенной структуры
 
Alexandr Andreev:
 Тут же просто обращения к даным возвращенной структуры

да, но смущает, что обращаюсь к полю byte без промежуточной переменной, сразу к результату функции f()

поэтому и жду подвоха к этому

f().byte
 
Igor Makanu:

да, но смущает, что обращаюсь к полю byte без промежуточной переменной, сразу к результату функции f()

поэтому и жду подвоха к этому

уже как несколько лет стабильно

 
Alexandr Andreev:

уже как несколько лет стабильно

ОК, спасибо!