Fragen zu OOP in MQL5 - Seite 65

 
Sergey Dzyublik:

Etwas, das Sie über Strukturen und Klassen (ohne neue) vergessen haben - sie fallen beide auf dem Stapel auf.

Nicht zu verwechseln mit C++, es ist näher an Sharp

 
Maxim Kuznetsov:

Nicht zu verwechseln mit C++, es ist näher an Sharp

Das ist Ihre Fantasie, nicht die Realität.
Man sollte nicht beweisen, was man nicht selbst getestet hat...
Das Erstellen von lokalen Variablen als Objekte von Strukturen und Klassen (ohne new) geschieht auf dem Stack.
Ich habe bereits beschrieben, wie Arrays in MT5funktionieren.

 
Dmitry Fedoseev:

Was für ein Pech!

1 - Durch die Erstellung von Objekten. 2 - einfach durch einen normalen Funktionsaufruf. Die erste Zahl ist die Zeit in Millisekunden, beachten Sie die zweite nicht.

Es ist fast 10 Mal schneller (und manchmal mehr als 10 Mal schneller). Was für eine traurige Sache... stapeln... stapeln... ***Ich weiß nicht.

Warum also nicht aufpassen? Lassen Sie mich raten: INT_MAX hat einmal eine Aktion über die Erstellung eines temporären Objekts ausgeführt und dann dieselbe Aktion über einen Funktionsaufruf?

Nun, es ist ein erwartetes Ergebnis, wenn man bedenkt, dass wir immer noch um die Erstellung der Klasse in der Laufzeit tanzen (wir sollten immer noch dieses Handle erhalten, das wie ein Index in einem Container aussieht).

PS. Wo ist der Quellcode für Replay?

PPS. Sind Sie sicher, dass die Funktion aufgerufen wurde? Wie auch immer, der Optimierer steckt auch in diesem Code, nicht die Tatsache, dass es einen Funktionsaufruf zur Laufzeit geben wird:

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

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

Die Tatsache, dass UB in mql ist, beweist diesen Code:

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:

Dass es UB in mql gibt, beweist dieser Code:

Sie haben den Compiler geschickt um den Finger gewickelt:
- false branch is thrown because there is no break from while(1) loop.
- true wird zurückgegeben, da Operationen an lokalen Variablen ohne jegliche Interaktion mit der "Außenwelt" durchgeführt werden und die Ausführung dieses Codes ebenfalls abgebrochen wird.

 
Sergey Dzyublik:

Sie haben den Compiler geschickt um den Finger gewickelt:
- die falsche Verzweigung wird ausgelöst, weil es keinen Bruch der while(1)-Schleife gibt.
- true wird zurückgegeben, da Operationen an lokalen Variablen ohne jegliche Interaktion mit der "Außenwelt" durchgeführt werden und die Ausführung dieses Codes ebenfalls abgebrochen wird.

Das bin nicht ich - das ist eines der Beispiele aus dem Internet. Das ist ein und dasselbe wie bei den Pluspunkten.

 
Vladimir Simakov:

Warum nicht aufpassen? Lassen Sie mich raten: INT_MAX hat einmal eine Aktion über die Erstellung eines temporären Objekts und dann dieselbe Aktion über einen Funktionsaufruf ausgeführt?

Nun, dies ist ein erwartetes Ergebnis, wenn man bedenkt, dass wir immer noch um die Erstellung der Klasse in der Laufzeit herumtanzen (wir sollten dieses Handle erhalten, das wie ein Index in einem Container aussieht).

PS. Wo ist der Quellcode für Replay?

PPS. Sind Sie sicher, dass die Funktion aufgerufen wurde? Wie auch immer, der Optimierer steckt auch in diesem Code, nicht die Tatsache, dass es einen Funktionsaufruf zur Laufzeit geben wird:

Die Tatsache, dass UB in mql ist, beweist diesen Code:

Sie irren sich. Sie müssen hier nicht raten, sondern nur an gestern denken. Bei Gedächtnisproblemen können Sie in den Zitaten nachsehen, worum es in der Diskussion geht. Warum wird das Ergebnis plötzlich erwartet, wenn Sie vorher das Gegenteil behauptet haben?

Ja, ich bin sicher, dass die Funktion aufgerufen wurde. Und ihr träumt alle gerne davon, dass ich ein Idiot bin? Warum bezieht sich die Frage nur auf die Funktion, und das Objekt wurde vielleicht auch nicht erstellt? Oder sind Sie so sicher, dass Sie wissen, wie alle Compiler funktionieren?

 
Sergey Dzyublik:

Kannst du erklären, worum es geht, denn ich bin ein bisschen dumm, ich habe es dreimal gelesen - aber ich verstehe es immer noch nicht...

Schauen Sie sich die Zitate an und sehen Sie, wovon wir sprechen. Was ich zitiert, und als Antwort auf das, was ich war diese Antwort aus dem Zitat zu bekommen.

 
und jedes Gespräch, das du je geführt hast, wurde zu solchem Unsinn... über den Stapel, über die Array-Zeichenkette... Ihre Erklärung durch "auf dem Stapel" funktioniert nicht.
 

Da es Dimitri zu peinlich war, seinen Code zu veröffentlichen, musste ich 15 Minuten lang selbst testen.

Ups. Bei identischen Vorgängen beträgt der Unterschied nur 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;}

Der Laufzeitunterschied bleibt auch ohne dieses ganze Brimborium mit statischen Variablen und Feldern bestehen. Es geht um die Differenz in Mikrosekunden, nicht um den Prozentsatz.

Fazit: Die Kosten für die Erstellung eines temporären Objekts auf dem Stack sind auf meinem nicht gerade schnellen Computer so gering, dass sie bei etwa 30-40 ns/pc (Nanosekunde) liegen, so dass ich in den meisten Fällen darauf achten sollte.

PS. Und ich dachte, schlecht über Entwickler, aber nein, man muss nur nicht die Menschen beim Wort nehmen und überprüfen Sie sie)))

 
Vladimir Simakov:

Da es Dimitri zu peinlich war, seinen Code zu veröffentlichen, musste ich 15 Minuten lang selbst testen.

Ups. Bei identischen Vorgängen beträgt der Unterschied nur 30 %.

Der Laufzeitunterschied bleibt auch ohne dieses ganze Brimborium mit statischen Variablen und Feldern bestehen. Es geht um die Differenz in Mikrosekunden, nicht um den Prozentsatz.

Fazit: Die Kosten für die Erstellung eines temporären Objekts auf dem Stack sind auf meinem nicht gerade schnellen Computer so gering, dass sie bei etwa 30-40 ns/pc (Nanosekunde) liegen, so dass ich in den meisten Fällen darauf achten sollte.

PS. Und ich dachte, schlecht über die Entwickler, aber nein, Sie einfach nicht das Wort der Menschen zu nehmen und überprüfen Sie sie)))

Und wenn man dann noch alle möglichen anderen Berechnungen anstellt, wird der Unterschied noch geringer. Auf jeden Fall kann dieser Test kaum als Test der identischen Funktionalität bezeichnet werden.

Außerdem sind die Tests selbst nicht identisch.

Grund der Beschwerde: