Errori, bug, domande - pagina 2745

 
fxsaber:

Domanda di ottimizzazione. Nel tester, su ogni segno di spunta ho bisogno di ottenere un segno di spunta per un ulteriore lavoro. Io lo faccio in questo modo.

È chiaro che questa variante sarà più lenta:

Ma SymbolInfoTick è anche più lento perché il suo parametro stringa non è passato per riferimento.

È possibile avere un regolare sovraccarico di SymbolInfo* dove la stringa è passata per riferimento?

È meglio avere

In Optimizer, queste funzioni sono chiamate decine di miliardi di volte.

Chiamare Symbol() espande SEMPRE l'accesso alla variabile globale _Symbol, così come Digits(), Point(), Period(), GetLastError(), IsStopped(), UninitializeReason()

 
Ilyas:

La chiamata Symbol() si svolge SEMPRE per accedere alla variabile globale _Symbol, così come Digits(), Point(), Period(), GetLastError(), IsStopped(), UninitializeReason()

E il passaggio di una stringa per riferimento?

 
fxsaber:

E passare una stringa per riferimento?

Apparentemente la ragione è uno dei problemi irrisolvibili in MQL - passare un letterale come parametro per const ref.

 
fxsaber:

È possibile avere sovraccarichi regolari di SymbolInfo*, dove la stringa è passata per riferimento?

Come potrebbero aiutare?

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

Restituisce ancora 1, non 2

 
fxsaber:

E passare una stringa per riferimento?

La stringa viene passata per riferimento.

Siamo passati da tempo a "copy_on_write string" -> quando si copia una stringa in un'altra il contenuto non viene copiato immediatamente (come era prima), il numero di riferimenti al buffer delle stringhe viene aumentato
Per esempio, il numero di riferimenti viene aumentato quando si passa una stringa per valore, come parametro e viene ridotto dopo la chiamata.
Quando

una stringa viene cambiata, viene controllato il conteggio dei riferimenti al buffer e se c'è più di un riferimento, la stringa da cambiare viene "scollegata" dal vecchio buffer e ne viene allocato uno nuovo.

 
A100:

Come possono aiutare?

Restituisce ancora (chiamato) 1, non 2

La variabile _Symbol è costante
 
Ilyas:
La variabile _Symbol è costante

Allora anche il sovraccarico non aiuterà.

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

ci sarà un errore già al momento della compilazione

 
Ilyas:

La stringa viene passata per riferimento.

Siamo passati da tempo a "copy_on_write string" -> quando si copia una stringa in un'altra il contenuto non viene copiato immediatamente (come era prima), il numero di riferimenti al buffer della stringa viene aumentato
Per esempio, il numero di riferimenti viene aumentato quando si passa una stringa per valore, come parametro e diminuito dopo la chiamata.
Quando

una stringa viene cambiata, viene controllato il conteggio dei riferimenti al buffer e se c'è più di un riferimento, la stringa cambiata viene "scollegata" dal vecchio buffer e gliene viene assegnato uno nuovo.

È tutto definito a livello di compilazione?

 

Errore del compilatore:

class CArray
{  
};

int ArraySize(const CArray&);


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

È tutto definito a livello di compilazione?

No. Non è ancora noto al momento della compilazione.