Preguntas sobre POO en MQL5 - página 65

 
Sergey Dzyublik:

Algo que olvidaste sobre las estructuras y las clases (sin novedad): ambas destacan en la pila.

No hay que confundirlo con C++, está más cerca de Sharp

 
Maxim Kuznetsov:

No hay que confundirlo con C++, está más cerca de Sharp

Esta es tu fantasía, no la realidad.
No deberías probar lo que no has probado tú mismo...
La creación de variables locales como objetos de estructuras y clases (sin new) ocurre en la pila.
Anteriormente describí cómofuncionan las matrices en MT5.

 
Dmitry Fedoseev:

¡Qué mala suerte!

1 - A través de la creación de objetos. 2 - simplemente a través de una llamada a una función normal. El primer número es el tiempo en milisegundos, no prestes atención al segundo.

Es casi 10 veces más rápido (y a veces más de 10 veces). Qué cosa más triste... apilar... amontonar... ***cha

¿Por qué no prestar atención? Déjame adivinar: ¿INT_MAX realizó una vez una acción a través de la creación de un objeto temporal, y luego la misma acción a través de una llamada a una función?

Bueno, es un resultado esperado, teniendo en cuenta que todavía estamos bailando alrededor de la creación de la clase en el tiempo de ejecución (todavía debemos obtener este mango que parece un índice en algún contenedor).

PS. ¿Dónde está el código fuente de la repetición?

PPS. ¿Está seguro de que la función fue llamada? De todos modos, el optimizador está en este código también, no el hecho de que habrá una llamada de función en tiempo de ejecución:

for (int i=0;i<500;++i){
   int x=Get(i);}

int Get(int x) {return -x;}

El hecho de que UB en mql está allí - demuestra este código:

void OnStart(){
   Print(Test()?"Ok":"No");
}

bool Test (void)
{
  const int MAX = 1000;
  int a=1,b=1,c=1;
  while (1) {
    if (((a*a*a) == ((b*b*b)+(c*c*c)))) return true;
    a++;
    int x=Get(a);
    if (a>MAX) {
      a=1;
      b++;
    }
    if (b>MAX) {
      b=1;
      c++;
    }      
    if (c>MAX) {
      c=1;
    }
  }
  return false;
}
 
Vladimir Simakov:

Que haya UB en mql prueba este código:

Usted ha envuelto hábilmente el compilador alrededor de su dedo:
- rama falsa se lanza porque no hay ruptura del bucle while(1).
- se devuelve true porque las operaciones se realizan en las variables locales sin ninguna interacción con el "mundo exterior" y la ejecución de este código también se tira.

 
Sergey Dzyublik:

Has envuelto inteligentemente al compilador alrededor de tu dedo:
- la rama falsa es lanzada porque no hay ruptura del bucle while(1).
- se devuelve true porque las operaciones se realizan en las variables locales sin ninguna interacción con el "mundo exterior" y la ejecución de este código también se tira.

No soy yo, es uno de los ejemplos de Internet. Es uno y el mismo de los pluses.

 
Vladimir Simakov:

¿Por qué no prestar atención? Déjame adivinar: ¿INT_MAX realizó una vez una acción mediante la creación de un objeto temporal y luego la misma acción mediante la llamada a una función?

En definitiva, se trata de un resultado esperado, teniendo en cuenta que todavía estamos bailando alrededor de la creación de la clase en la aleatorización (deberíamos obtener este manejador que parece un índice en algún contenedor).

PS. ¿Dónde está el código fuente de la repetición?

PPS. ¿Está seguro de que la función fue llamada? De todos modos, el optimizador está en este código también, no el hecho de que habrá una llamada de función en tiempo de ejecución:

El hecho de que UB esté en mql prueba este código:

Te equivocas. No tienes que adivinar aquí, sólo recuerda que ayer, en caso de problemas de memoria, puedes buscar entre las citas para ver de qué trata la discusión. ¿Por qué el resultado se ha convertido de repente en algo esperado, si antes afirmabas lo contrario?

Sí, estoy seguro de que la función fue llamada. ¿Y a todos les gusta soñar que soy un idiota? ¿Por qué la pregunta es sólo sobre la función, y tal vez el objeto no fue creado tampoco? ¿O estás tan seguro de saber cómo funcionan todos los compiladores?

 
Sergey Dzyublik:

Me puedes explicar de qué va, porque soy un poco tonto, lo he leído tres veces - pero sigo sin entenderlo...

Mire las citas y vea de qué estamos hablando. Lo que he citado, y en respuesta a lo que estaba recibiendo esta respuesta de la cita.

 
y cada conversación que has tenido se ha convertido en una tontería... sobre la pila, sobre la cadena de array... Su explicación a través de "en la pila" no funciona.
 

Como a Dimitri le daba vergüenza publicar su código, he tenido que hacer yo mismo 15 minutos de pruebas.

Uy. Con operaciones idénticas, la diferencia es sólo del 30%.

class CTest{
   static uint count;
   static double temp;
   int i;
public:
   CTest(int _x):i(_x){++count; temp+=(double)GetMicrosecondCount(); temp/=count;}
   ulong Get() {return GetMicrosecondCount()+i;}
   static uint Count()  {return count;}
   static double Temp() {return temp;}
};

int i=1;
double temp;

uint CTest::count=0;
double CTest::temp=0.0;

void OnStart(){
   ulong t=GetMicrosecondCount();
   for (;i<1000001;++i){
      temp+=(double)CTest(i).Get();
      temp/=i;}
   ulong _t=GetMicrosecondCount()-t;
   Print(_t," | ",i);
   Print(CTest::Count());
   Print(CTest::Temp());
   t=GetMicrosecondCount();
   for (;i<2000001;++i){
      temp+=(double)Test(i);
      temp/=i;}
   _t=GetMicrosecondCount()-t;
   Print(_t," | ",i);
   Print(temp);
}

ulong Test(int x) {
   static uint count=0;
   static double _temp=0.0;
   ++count;
   _temp+=(double)GetMicrosecondCount();
   _temp/=count;
   return GetMicrosecondCount()+x;}

La diferencia en tiempo de ejecución persiste incluso sin todo este lío con las variables y campos estáticos. Es la diferencia en microsegundos, no el porcentaje.

Conclusión: El coste de crear un objeto temporal en la pila es lo suficientemente pequeño en mi ordenador, que no es el más rápido, como para ser de unos 30-40 ns/pc (nanosegundo), por lo que debería prestarle atención en la mayoría de los casos.

PS. Y pensaba mal de los desarrolladores, pero no, simplemente no hay que tomar la palabra a la gente y comprobarla)))

 
Vladimir Simakov:

Como a Dimitri le daba vergüenza publicar su código, he tenido que hacer yo mismo 15 minutos de pruebas.

Uy. Con operaciones idénticas, la diferencia es sólo del 30%.

La diferencia en tiempo de ejecución persiste incluso sin todo este lío con las variables y campos estáticos. Es la diferencia en microsegundos, no el porcentaje.

Conclusión: El coste de crear un objeto temporal en la pila es lo suficientemente pequeño en mi ordenador, que no es el más rápido, como para ser de unos 30-40 ns/pc (nanosegundo), por lo que debería prestarle atención en la mayoría de los casos.

PS. Y pensaba mal de los desarrolladores, pero no, simplemente no se toma la palabra de la gente y se comprueba)))

Y aún más hacer todo tipo de cálculos diferentes en el interior, la diferencia será aún menor. De todos modos, esta prueba difícilmente puede llamarse una prueba de funcionalidad idéntica.

Además, las pruebas en sí no son idénticas.