Preguntas sobre POO en MQL5 - página 88

 
Igor Makanu:
mismos valores, la velocidad de la prueba "flota" por alguna razón, pero pasar los parámetros en los métodos por referencia sigue siendo más eficiente

También está esta opción:

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:

También existe esta opción:

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 : : bucles = 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 : : bucles = 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 : : bucles = 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

extraño, pero no hay diferencia

UPD: si no me equivoco, hace años busqué un error en MT4 - pasé argumentos a una función NO por referencia y luego cambié (me equivoqué) uno de los argumentos de la función en el cuerpo de la función. pude cambiar un argumento pasado por referencia, tal vez en la variante E el compilador pasó todos los argumentos por referencia también.

 
Igor Makanu:
extraño, pero no hay diferencia.

No hay nada extraño en ello. doble es de 8 bytes, la referencia también es de 8 bytes. Pero la referencia todavía tiene que obtener los 8 bytes del número.

 
Koldun Zloy:

No hay nada extraño en ello. doble es de 8 bytes, la referencia también es de 8 bytes. Pero el enlace todavía tiene que obtener 8 bytes de un número.

Eso tiene sentido, y los números suman 8 de ida y 8 de vuelta ))

¿pero el bus no es de 8 bits en un procesador? debería leer 8 bytes = 64 bits por ciclo de reloj?

 
Igor Makanu:

eso tiene sentido, y los números suman 8 de ida y 8 de vuelta ))

Pero el bus no es de 8 bits en un procesador, ¿se supone que lee 8 bytes = 64 bits por ciclo de reloj?

Ahí no es tan sencillo. La velocidad depende tanto de la memoria en la que se encuentre el objeto como de otras razones.

En un programa real, el resultado puede ser muy diferente al de una simple prueba.

Normalmente las clases y estructuras se pasan por referencia.

Los tipos simples se pasan por referencia sólo si algún valor es devuelto por él.

 

Me sorprendió descubrir que se puede acceder a los campos de la estructura incluso si ésta se devuelve como resultado de una función

este código funciona correctamente (llenamos la estructura en la función, y luego copiamos el resultado de la función en una matriz de bytes)

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

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

es conveniente utilizar dicho acceso al campo de la estructura, .... ¿dónde puede haber escollos - bugs/errores?

 
Igor Makanu:

Me sorprendió descubrir que se puede acceder a los campos de la estructura incluso si ésta se devuelve como resultado de una función

este código funciona correctamente (llenamos la estructura en la función, y luego copiamos el resultado de la función en una matriz de bytes)

es conveniente utilizar dicho acceso al campo de la estructura, .... ¿dónde puede haber escollos/fallos/errores?

Este tipo de cosas)) no hay bichos.

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

Así que más correctamente es de la ópera (.)(.)

Tampoco entiendo qué tiene que ver copiar en un array de bytes. Sólo se trata de acceder a los datos de la estructura devuelta
 
Alexandr Andreev:
Esto es sólo el acceso a los datos de la estructura devuelta

Sí, pero es confuso que esté accediendo al campo de bytes sin una variable intermedia, directamente al resultado de la función f()

por eso estoy esperando una captura

f().byte
 
Igor Makanu:

sí, pero es confuso que esté accediendo al campo de bytes sin una variable intermedia, directamente al resultado de la función f()

por eso estoy esperando una captura

se mantiene estable desde hace unos años.

 
Alexandr Andreev:

se mantiene estable desde hace unos años.

Bien, ¡gracias!