Domande su OOP in MQL5 - pagina 88

 
Igor Makanu:
stessi valori, la velocità del test "galleggia" per qualche motivo, ma passare parametri nei metodi per riferimento è ancora più efficiente

Poi c'è questa opzione:

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:

Poi c'è anche questa opzione:

2020.07.26 10:10:52.254 class_global (EURUSD,H1) classe A : : loop = 10000000000 ms=46141

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

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

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

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

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

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

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

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

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

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

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

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

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

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

strano, ma nessuna differenza

UPD: se non mi sbaglio, ho cercato un errore in MT4 anni fa - ho passato argomenti a una funzione NON per riferimento e poi ho cambiato (fatto un errore) uno degli argomenti della funzione nel corpo della funzione. ho potuto cambiare un argomento passato per riferimento, forse nella variante E il compilatore ha passato anche tutti gli argomenti per riferimento.

 
Igor Makanu:
strano, ma non c'è differenza.

Non c'è niente di strano. doppio è di 8 byte, il riferimento è anch'esso di 8 byte. Ma il riferimento deve ancora ottenere gli 8 byte del numero.

 
Koldun Zloy:

Non c'è niente di strano. doppio è di 8 byte, il riferimento è anch'esso di 8 byte. Ma il link ha ancora bisogno di ottenere 8 byte di un numero.

Questo ha senso, e i numeri si sommano a 8 lì e 8 indietro ))

ma il bus non è 8 bit in un processore? dovrebbe leggere 8 byte = 64 bit per ciclo di clock?

 
Igor Makanu:

questo ha senso, e i numeri si sommano a 8 lì e 8 indietro ))

Ma il bus non è di 8 bit in un processore, dovrebbe leggere 8 byte = 64 bit per ciclo di clock?

Non è così semplice lì. La velocità dipende sia da quale memoria si trova l'oggetto che da altri motivi.

In un programma reale, il risultato può essere molto diverso da quello di un semplice test.

Di solito le classi e le strutture vengono passate per riferimento.

I tipi semplici sono passati per riferimento solo se qualche valore viene restituito da esso.

 

Sono stato sorpreso di scoprire che si può accedere ai campi della struttura anche se questa struttura viene restituita come risultato di una funzione

questo codice funziona correttamente (riempiamo la struttura nella funzione, poi copiamo il risultato della funzione in un array di byte)

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

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

è conveniente usare tale accesso al campo della struttura, .... dove possono esserci insidie - bug/errori?

 
Igor Makanu:

Sono stato sorpreso di scoprire che si può accedere ai campi della struttura anche se questa struttura viene restituita come risultato di una funzione

questo codice funziona correttamente (riempiamo la struttura nella funzione, poi copiamo il risultato della funzione in un array di byte)

è conveniente usare tale accesso al campo della struttura, .... dove possono esserci insidie/insidie/errori?

Questo genere di cose)) non ci sono bug.

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

Quindi più correttamente è dall'opera (.)(.)

Inoltre non capisco cosa c'entri la copia in un array di byte. Si tratta solo di accedere ai dati della struttura restituita
 
Alexandr Andreev:
Questo è solo l'accesso ai dati della struttura restituita

Sì, ma mi confonde il fatto che sto accedendo al campo byte senza una variabile intermedia, direttamente al risultato della funzione f()

ecco perché sto aspettando una cattura

f().byte
 
Igor Makanu:

Sì, ma mi confonde il fatto che sto accedendo al campo byte senza una variabile intermedia, direttamente al risultato della funzione f()

ecco perché sto aspettando una cattura

è stabile da qualche anno ormai.

 
Alexandr Andreev:

è stabile da qualche anno.

OK, grazie!