Fehler, Irrtümer, Fragen - Seite 2745

 
fxsaber:

Frage der Optimierung. Im Prüfgerät muss ich bei jedem Häkchen ein Häkchen für die weitere Arbeit bekommen. Ich mache es so.

Es ist klar, dass diese Variante langsamer sein wird:

Aber SymbolInfoTick ist auch langsamer, weil sein String-Parameter nicht per Referenz übergeben wird.

Ist es möglich, eine reguläre SymbolInfo* Überladung zu haben, wo String durch Referenz übergeben wird?

Es ist besser, eine

In Optimizer werden diese Funktionen zig-Milliarden Mal aufgerufen.

Der Aufruf von Symbol() erweitert IMMER den Zugriff auf die globale Variable _Symbol, ebenso wie Digits(), Point(), Period(), GetLastError(), IsStopped(), UninitializeReason()

 
Ilyas:

Der Aufruf Symbol() entfaltet sich IMMER zum Zugriff auf die globale Variable _Symbol, ebenso wie Digits(), Point(), Period(), GetLastError(), IsStopped(), UninitializeReason()

Und die Übergabe einer Zeichenkette per Referenz?

 
fxsaber:

Und die Übergabe einer Zeichenkette per Referenz?

Offensichtlich ist der Grund dafür eines der unlösbaren Probleme in MQL - die Übergabe eines Literal als Parameter per const ref.

 
fxsaber:

Ist es möglich, reguläre SymbolInfo* Überladungen zu haben, wo String durch Referenz übergeben wird?

Wie würden sie helfen?

int SymbolInfoTick( string  symbol ) { return 1; }
int SymbolInfoTick( string& symbol ) { return 2; }
void OnStart()
{
        Print( SymbolInfoTick( _Symbol ));
}

Es wird immer noch 1 und nicht 2 zurückgegeben.

 
fxsaber:

Und die Übergabe einer Zeichenkette per Referenz?

Die Zeichenkette wird als Referenz übergeben.

Wir haben schon vor langer Zeit auf "copy_on_write string" umgestellt -> beim Kopieren einer Zeichenkette in eine andere wird der Inhalt nicht sofort kopiert (wie früher), sondern die Anzahl der Verweise auf den Zeichenkettenpuffer wird erhöht
. Zum Beispiel wird die Anzahl der Verweise erhöht, wenn eine Zeichenkette als Parameter übergeben wird, und nach dem Aufruf reduziert.
Wenn

eine Zeichenkette geändert wird, wird die Anzahl der Pufferreferenzen überprüft, und wenn es mehr als eine Referenz gibt, wird die zu ändernde Zeichenkette aus dem alten Puffer "entkoppelt" und ein neuer zugewiesen.

 
A100:

Wie können sie helfen?

Es wird immer noch 1 zurückgegeben (aufgerufen), nicht 2.

Die Variable _Symbol ist konstant
 
Ilyas:
Die Variable _Symbol ist konstant

Dann hilft auch eine Überlastung nicht.

int SymbolInfoTick(       string  ) { return 1; }
int SymbolInfoTick( const string& ) { return 2; }
void OnStart()
{
        Print( SymbolInfoTick( _Symbol )); //Error
}

wird bereits bei der Kompilierung ein Fehler auftreten

 
Ilyas:

Die Zeichenkette wird als Referenz übergeben.

Wir sind längst zu "copy_on_write string" übergegangen -> beim Kopieren einer Zeichenkette in eine andere wird der Inhalt nicht sofort kopiert (wie früher), sondern die Anzahl der Verweise auf den Zeichenkettenpuffer wird erhöht
. Zum Beispiel wird die Anzahl der Verweise erhöht, wenn eine Zeichenkette als Parameter übergeben wird, und nach dem Aufruf verringert.
Wenn

eine Zeichenkette geändert wird, wird die Anzahl der Pufferreferenzen überprüft, und wenn es mehr als eine Referenz gibt, wird die geänderte Zeichenkette aus dem alten Puffer "entkoppelt" und ein neuer Puffer wird ihr zugewiesen.

Ist dies alles auf Kompilierebene definiert?

 

Compiler-Fehler:

class CArray
{  
};

int ArraySize(const CArray&);


void Main()
{
  CArray arr;
  ArraySize(arr);  // Нормально
  
  CArray arrays[1];
  ArraySize(arrays[0]); // 'arrays' - array required
}
 
fxsaber:

Ist dies alles auf Kompilierebene definiert?

Nein. Sie ist zur Kompilierzeit noch nicht bekannt.