class A
{
private:
int f1(){Print(__FUNCTION__); return(1);}
int f2(){Print(__FUNCTION__); return(2);}
public:
int func(int v){constint a = f1(); constint b = f2(); return(a+b+v);}
};
A a1,a2;
//+------------------------------------------------------------------+voidOnStart()
{
Print("1. ",a1.func(1));
Print("2. ",a1.func(2));
Print("3. ",a2.func(3));
Print("4. ",a2.func(4));
}
//+------------------------------------------------------------------+
2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1
2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2
2020.03.21 12:55:59.904 tst (EURUSD,H1) 1.4
2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1
2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2
2020.03.21 12:55:59.904 tst (EURUSD,H1) 2.5
2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1
2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2
2020.03.21 12:55:59.904 tst (EURUSD,H1) 3.6
2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1
2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2
2020.03.21 12:55:59.904 tst (EURUSD,H1) 4.7
const を static に置き換えると、期待通りに動作します - a と b の初期化時に f1() と f2() を 1 回ずつ呼び出すだけです。
int func(int v){staticint a = f1(); staticint b = f2(); return(a+b+v);}
class A
{
private:
int f1()const {staticint v1=1; Print(__FUNCTION__); return(v1++);}
int f2()const {staticint v2=1; Print(__FUNCTION__); return(v2++);}
public:
int func(int v){constint a = f1(); constint b = f2(); return(a+b+v);}
};
2365 - コードにエラーが散見された。まだ、それを理解する時間がなかったのです。2361にロールバックしたところ、大丈夫でした。mq4では - 同じ状況です。
メッセージありがとうございます、確認します
ベースクラスのコンストラクタを呼び出す際のパラメータ受け渡しに あるようです。
バグ番号: MT5 (build 2365) コンストラクタの引数に参照渡しのポインタを 使用した場合、代入演算子を使用したクラスへの 暗黙のコンストラクタ 呼び出しでコンパイルエラーが発生します。
参照渡しのポインタが値渡しに置き換われば、すべてがうまくいく。
投稿ありがとうございます、修正しました
MT5 (build 2365) のバグで、テンプレートクラスのテンプレートパラメータがベースクラスとして使用されている場合、ベースクラスのコンストラクタを 呼び出すとコンパイルエラーが発生します。
MT5(build 2363)では問題ありません。
オブジェクトに対するArrayResizeが高速化されたことがわかります。
再び、ArrayResize関数の1部分の複雑さが対数からゼロになりました
予約メモリに対するArrayResizeの 高速化、どうもありがとうございました。
MT5 (build 2365)の実プロジェクトでstd::vector::push_backが以前のビルドより1.5倍高速化されました。
また、std::vector:resizeのラグが2.2倍から1.45倍に減少しています。
build 2366、定数が正しく動作しなくなった気がします。
2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1
2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2
2020.03.21 12:55:59.904 tst (EURUSD,H1) 1.4
2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1
2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2
2020.03.21 12:55:59.904 tst (EURUSD,H1) 2.5
2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1
2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2
2020.03.21 12:55:59.904 tst (EURUSD,H1) 3.6
2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1
2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2
2020.03.21 12:55:59.904 tst (EURUSD,H1) 4.7
const を static に置き換えると、期待通りに動作します - a と b の初期化時に f1() と f2() を 1 回ずつ呼び出すだけです。
2020.03.21 12:58:03.496 tst (EURUSD,H1) A::f1
2020.03.21 12:58:03.496 tst (EURUSD,H1) A::f2
2020.03.21 12:58:03.496 tst (EURUSD,H1) 1.4
2020.03.21 12:58:03.496 tst (EURUSD,H1) 2.5
2020.03.21 12:58:03.496 tst (EURUSD,H1) 3.6
2020.03.21 12:58:03.496 tst (EURUSD,H1) 4.7
こんなコードを書いたら、完全にバグで捕捉されない
build 2366、定数が正しく動作しなくなった気がします。
2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1
2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2
2020.03.21 12:55:59.904 tst (EURUSD,H1) 1.4
2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1
2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2
2020.03.21 12:55:59.904 tst (EURUSD,H1) 2.5
2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1
2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2
2020.03.21 12:55:59.904 tst (EURUSD,H1) 3.6
2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f1
2020.03.21 12:55:59.904 tst (EURUSD,H1) A::f2
2020.03.21 12:55:59.904 tst (EURUSD,H1) 4.7
const を static に置き換えると、期待通りに動作します - a と b の初期化時に f1() と f2() を 1 回ずつ呼び出すだけです。
2020.03.21 12:58:03.496 tst (EURUSD,H1) A::f1
2020.03.21 12:58:03.496 tst (EURUSD,H1) A::f2
2020.03.21 12:58:03.496 tst (EURUSD,H1) 1.4
2020.03.21 12:58:03.496 tst (EURUSD,H1) 2.5
2020.03.21 12:58:03.496 tst (EURUSD,H1) 3.6
2020.03.21 12:58:03.496 tst (EURUSD,H1) 4.7
これはまさに、あるべき姿です。
こんなコードを書いたら、完全に検出不能なバグになる。
こちらもすべて正しいです。
これはまさに、あるべき姿です。
昨年はそのようにはいきませんでしたが、特別にconst修飾子をテストしました
で、@Ilyas さんが説明したMQLプログラムの実行方法は、まずconstとstaticがどこに記述されていてもすべて初期化され、その後クラスのコンストラクタが呼ばれるようです。
OK、この初期化 static / const で、まだ適切に配布することができます - しかし、const 修飾子は、コンパイラがこれをチェックすることを保証しないという事実は非常に予想外です - 私の第二の例