MQL5におけるOOPに関する質問 - ページ 88

 
Igor Makanu:
同じ値でも、テストの速度はなぜか「浮く」けど、メソッドのパラメータを 参照渡し した方がまだ効率がいい

それから、こんな選択肢もあります。

class E
{
   double f1( double a, double b )  { return(a + 1.0/(1.0+(double)rand())); }
   double f2( double a, double b )  { return(b + 1.0/(1.0+(double)rand())); }
   double f3( double a, double b )  { return(a/b + 1.0/(1.0+(double)rand())); }
   
public:
   double calc( const MqlTick& tick )
   {
      return f1( tick.ask, tick.bid ) + f2( tick.ask, tick.bid ) + f3( tick.ask, tick.bid );
   }
};
 
Koldun Zloy:

それから、こんな選択肢もあります。

2020.07.26 10:10:52.254 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46141

2020.07.26 10:11:30.261 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38000

2020.07.26 10:12:08.258 class_global (EURUSD,H1) class C :: ループ数 = 10000000000 ms=38000

2020.07.26 10:12:46.254 class_global (EURUSD,H1) class D : : loops = 10000000000 ms=38000

2020.07.26 10:13:24.279 class_global (EURUSD,H1) class E : : loops = 10000000000 ms=38031

2020.07.26 10:14:10.484 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46203

2020.07.26 10:14:48.570 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38078

2020.07.26 10:15:26.737 class_global (EURUSD,H1) class C :: ループ数 = 10000000000 ms=38172

2020.07.26 10:16:04.734 class_global (EURUSD,H1) class D : : loops = 10000000000 ms=38000

2020.07.26 10:16:42.739 class_global (EURUSD,H1) class E : : loops = 10000000000 ms=38000

2020.07.26 10:17:28.886 class_global (EURUSD,H1) class A : : loops = 10000000000 ms=46141

2020.07.26 10:18:06.894 class_global (EURUSD,H1) class B : : loops = 10000000000 ms=38015

2020.07.26 10:18:44.888 class_global (EURUSD,H1) class C :: ループ数 = 10000000000 ms=38000

2020.07.26 10:19:22.948 class_global (EURUSD,H1) class D : : loops = 10000000000 ms=38047

2020.07.26 10:20:00.983 class_global (EURUSD,H1) class E : : loops = 10000000000 ms=38047

変わり映えしない

UPD: もし私が間違っていなければ、何年か前にMT4で間違いを探しました - 関数に引数を参照で渡さず、関数本体の 引数の1つを変更しました(間違えました)。

 
Igor Makanu:
不思議なことに、違いはないんです。

何も不思議なことはないんです。doubleは8バイト、リファレンスも8バイトです。しかし、リファレンスはまだ8バイトの数字を取得する必要があります。

 
Koldun Zloy:

何も不思議なことはないんです。doubleは8バイト、リファレンスも8バイトです。しかし、リンクはまだ8バイトの番号を取得する必要があります。

それは理にかなっていて、数字を足すとあっちが8、こっちが8となる ))

しかし、プロセッサのバスは8ビットではないので、1クロックあたり8バイト=64ビットを読み取る必要があるのでは?

 
Igor Makanu:

というのは理にかなっていて、数字を足すとあっちが8、こっちが8となります ))

しかし、プロセッサのバスは8ビットではないので、1クロックあたり8バイト=64ビットを読み取ることになっているのでしょうか?

そこはそんなに単純な話ではない。速度は、オブジェクトがどのメモリにあるかという理由と、その他の理由の両方に依存します。

実際のプログラムでは、単純なテストの結果とは大きく異なることがあります。

通常、クラスや構造体は参照渡しです。

単純な型は、それによって何らかの値が返される場合にのみ参照渡しされる。

 

この構造体が関数の結果として返される場合でも、構造体フィールドにアクセス できることに驚きました

このコードは正しく動作します (関数内で構造体を埋めてから、関数の結果をバイト配列にコピーしています)。

struct UcharArray
{
   uchar             byte[];
};
//+------------------------------------------------------------------+
UcharArray f()
{
   UcharArray result;
   for(uchar i = 0; i < 10; i++)
   {
      uchar tmp[1];
      tmp[0] = i;
      ArrayCopy(result.byte, tmp, ArraySize(result.byte));
   }
   return result;
}
//+------------------------------------------------------------------+
void OnStart()
{
   uchar arr[];
   for(int i = 0; i < 3; i++)
   {
      ArrayCopy(arr, f().byte, ArraySize(arr));
   }
   
   ArrayPrint(arr); // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9

}
//+------------------------------------------------------------------+

このような構造体へのアクセスを利用すると便利です。どこに落とし穴があるのか、バグやエラーは?

 
Igor Makanu:

この構造体が関数の結果として返される場合でも、構造体フィールドにアクセス できることに驚きました

このコードは正しく動作します (関数内で構造体を埋めてから、関数の結果をバイト配列にコピーしています)。

このような構造体へのアクセスを利用すると便利です。落とし穴やバグ、エラーはどこにあるのか?

こういうこと)) バグはないです。

 ArrayCopy(arr, (f()).byte, ArraySize(arr))

だから、より正確にはオペラからです(..)(..)

また、バイト配列にコピーすることの意味もよくわかりません。返された構造体からデータにアクセスすることだけです
 
Alexandr Andreev:
これは、返された構造体のデータにアクセスするだけです。

そうなんですが、中間変数なしで、f()関数の結果に直接byteフィールドにアクセスしているのが紛らわしいです

というわけで、キャッチボールをお待ちしております。

f().byte
 
Igor Makanu:

そうなんですが、中間変数なしで、f()関数の結果に直接byteフィールドにアクセスしているのが紛らわしいです。

というわけで、キャッチボールをお待ちしております。

ここ数年、安定しています。

 
Alexandr Andreev:

は、ここ数年、安定しています。

OK、ありがとうございます!