エラー、バグ、質問 - ページ 2745

 
fxsaber:

最適化に関する質問です。テスターでは、すべてのティックに、さらなる作業のためのティックが必要なのです。私はこの方法でやっています。

このバリエーションが遅くなることは明らかです。

しかし、SymbolInfoTickは、文字列パラメータが参照渡しでないため、速度も遅くなります。

文字列を参照渡しする通常のSymbolInfo*オーバーローディングは可能でしょうか?

があったほうがいい。

Optimizerでは、これらの関数が何百億回と呼び出される。

Symbol()を呼び出すと、Digits()、Point()、Period()、GetLastError()、IsStopped()、 UninitializeReason()と同様に常にグローバル変数_Symbolにアクセスできるように拡張されます。

 
Ilyas:

Symbol() は、Digits(), Point(), Period(), GetLastError(), IsStopped(), UninitializeReason() と同様に、常にグローバル変数 _Symbol にアクセスするように展開される。

また、文字列の参照渡しは?

 
fxsaber:

また、文字列の参照渡しは?

どうやら原因は、MQLの解決できない問題の1つ、const refでリテラルをパラメータとして渡すことにあるようです。

 
fxsaber:

文字列を参照渡しする通常のSymbolInfo*オーバーロードは可能でしょうか?

どのように役立つのでしょうか?

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

2 ではなく 1 を返します

 
fxsaber:

また、文字列の参照渡しは?

文字列は参照渡しである。

文字列を別の文字列にコピーする際、内容がすぐにコピーされないため、文字列バッファの 参照カウントが増加する
例えば、文字列を値で渡す場合、パラメータとして渡す場合は参照カウントが増加し、呼び出し後に減少します。
文字列を変更する

場合、バッファの参照回数をチェックし、複数の参照がある場合は、変更する文字列を古いバッファから「アンリンク」し、新しいバッファを確保します。

 
A100:

どのように役立つのでしょうか?

2 ではなく 1 を返す (呼び出される) ことに変わりはない

変数_Symbolは定数
 
Ilyas:
変数_Symbolは定数

それから、オーバーロードも役に立ちません。

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

コンパイル時にすでにエラーが発生します。

 
Ilyas:

文字列は参照渡しである。

文字列を別の文字列にコピーするとき、(以前のように)すぐに内容がコピーされるのではなく、文字列バッファへの 参照数が増加します
例えば、文字列を値で渡すとき、パラメータとして参照数が増加し、呼び出し後に減少します。
文字列が変更さ

れると、バッファの参照カウントがチェックされ、複数の参照がある場合、変更された文字列は古いバッファから「アンリンク」され、新しいバッファが割り当てられる。

これはすべてコンパイルレベルで定義されているのでしょうか?

 

コンパイラーエラーです。

class CArray
{  
};

int ArraySize(const CArray&);


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

これはすべてコンパイルレベルで定義されているのでしょうか?

いいえ、コンパイル時にはまだ分かっていません。