Perguntas sobre OOP em MQL5 - página 88

 
Igor Makanu:
mesmos valores, a velocidade do teste "flutua" por alguma razão, mas a passagem de parâmetros nos métodos por referência ainda é mais eficiente

Depois há esta opção:

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:

Depois há também esta opção:

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

estranho, mas sem diferença

UPD: se não me engano, procurei por um erro no MT4 anos atrás - passei argumentos para uma função NÃO por referência e depois mudei (cometi um erro) um dos argumentos da função no corpo da função. poderia mudar um argumento passado por referência, talvez na variante E o compilador passou todos os argumentos também por referência.

 
Igor Makanu:
estranho, mas não há diferença.

Não há nada de estranho nisso. duplo é de 8 bytes, a referência também é de 8 bytes. Mas a referência ainda tem que obter os 8 bytes do número.

 
Koldun Zloy:

Não há nada de estranho nisso. duplo é de 8 bytes, a referência também é de 8 bytes. Mas o link ainda tem que receber 8 bytes de um número.

Isso faz sentido, e os números somam 8 ali e 8 atrás ))

mas o ônibus não é de 8 bits em um processador? deve ler 8 bytes = 64 bits por ciclo de relógio ?

 
Igor Makanu:

que faz sentido, e os números somam 8 ali e 8 atrás ))

Mas o ônibus não é 8 bits em um processador, ele deve ler 8 bytes = 64 bits por ciclo de relógio ?

Lá não é tão simples assim. A velocidade depende tanto da memória em que o objeto se encontra quanto de outras razões.

Em um programa real, o resultado pode ser muito diferente do resultado de um simples teste.

Normalmente as classes e estruturas são passadas por referência.

Os tipos simples são passados por referência somente se algum valor for devolvido por ela.

 

Fiquei surpreso ao descobrir que os campos da estrutura podem ser acessados mesmo que esta estrutura seja devolvida como resultado de uma função

este código funciona corretamente (preenchemos a estrutura na função, depois copiamos o resultado da função em uma 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

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

é conveniente usar esse acesso ao campo de estrutura, .... onde pode haver armadilhas - insetos/erros ?

 
Igor Makanu:

Fiquei surpreso ao descobrir que os campos da estrutura podem ser acessados mesmo que essa estrutura seja devolvida como resultado de uma função

este código funciona corretamente (preenchemos a estrutura na função, depois copiamos o resultado da função em uma matriz de bytes)

é conveniente usar esse acesso ao campo de estrutura, .... onde pode haver armadilhas/bugs/erros ?

Este tipo de coisa)) não há insetos.

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

Portanto, mais corretamente é da ópera (.)(.)

Eu também não entendo o que a cópia em matriz de bytes tem a ver com isso. Trata-se apenas de acessar os dados da estrutura retornada
 
Alexandr Andreev:
Isto é apenas acessar os dados da estrutura retornada

sim, mas é confuso que eu esteja acessando o campo de bytes sem uma variável intermediária, diretamente para o resultado da função f()

é por isso que estou esperando por uma captura

f().byte
 
Igor Makanu:

sim, mas é confuso que eu esteja acessando o campo de bytes sem uma variável intermediária, diretamente para o resultado da função f()

é por isso que estou esperando por uma captura

tem se mantido estável há alguns anos.

 
Alexandr Andreev:

tem se mantido estável há alguns anos.

OK, obrigado!