OOPに関するヘルプ - ページ 3

 
Vasiliy Sokolov #:

OKです。理解できない。わかりましたか?本当に理解しているのか?その通り?

この議論は、次のような発言に集約される。

...

それは一般論ではなく、一つの記事に関する状況についてであり、何が問題なのかを説明したのです。なるほど、大惨事はなかった。

 

宣言された配列double x[268435448];

OnStart()関数 内にも同じ配列が存在する。

また、LONG_MAXの深さで再帰的に呼び出すようにした。

問題ありません。

 
fxsaber #:

静的配列を使用しないのですか?

配列のサイズが小さく、一定で、事前に分かっている場合は、静的の方が良く、おそらく速いでしょう。

 
Andrei Trukhanovich #:

配列のサイズが小さく、一定で、事前に分かっている場合は、静的の方が良く、おそらく速いでしょう。

スタティック変数/配列の一覧とそのサイズを取得する方法が欲しいです。おそらく、ここで 行われているようなコードパーサーが必要なのでしょう。

静的な文字列配列とダブル配列は全く別物なんでしょうね。

MQL5 Program Packer
MQL5 Program Packer
  • www.mql5.com
This is MQL5 project packer: assemble all source and resource files from dependencies into a single ZIP.
 
fxsaber #:

静的な文字列配列とダブル配列は全く別物なんでしょうね。

文字列は基本的にポインタと int サイズで構成される内部クラスであり,例えば double 配列の場合,条件付きで 1.5 倍の容量を占めることになる

何百万もの要素を持つ静的配列でもない限り、わざわざやる意味はあまりないと思うのですが。

 
fxsaber #:

静的配列を使用しない?

つまり、MQLには基本的に4種類のデータが存在するのです。

  • 静的な定義済みのデータ。コンパイル時にプログラムに縫い込まれ、もはや修正されることはない。プライベートメモリースペースに設置されています。例えば、char[1024]型の静的配列である。
  • ポインターでデータを手動で管理。これらはクラスのインスタンスですが、ポインタによって定義されます。例えば、CFoo* barのように、barはCFooのインスタンスです。これらのインスタンスは、POINTER_DYNAMIC型である。このストレージタイプは、ほとんどの場合必要ないのですが、最も問題があります。
  • プログラムが動作しているmql仮想マシンのゴミ箱で管理されているデータ。これには、クラスのインスタンスも含まれます。この型のオブジェクトへのポインタは POINTER_AUTOMATIC になる。このようなオブジェクト自体は、この仮想マシンのヒープにあるか、プライベートセクションにあるかのどちらかです。正確な方法は、データとそのサイズ、そして開発者が持っているものに依存するようです。この情報は入手できません。このようなデータには、例えばユーザークラスが含まれる。ポインタを持たないクラスインスタンスの定義は、このストレージタイプを定義します。例えば、CFoo bar は bar クラス CFoo のインスタンスを定義し、そのポインタは解放する必要がない。仮想マシンは、リリースのすべての操作を実行します。delete演算子を使う必要がないため、オブジェクトが漏れるという問題に直面します。
  • スタックに配置されたデータ。これらは、まず、関数のローカル変数である。つまり、何らかの関数内でint a = 5と書くと、スタックの先頭が4バイト上に移動し、必要なメモリサイズが確保されるのです。おそらく、MQLではスタックに格納される型は構造体も含むのでしょう(正直なところ、確認したことはありません)。このようなデータはあまり場所を取らず、ネストした関数の呼び出しの連鎖を考慮しても、スタック全体としてはヒープよりはるかに少ないメモリしか必要としない。このタイプのストレージは自動的に使用されるので、考える必要はありません。

スタックを関数とそのローカル変数に任せると、3つの型を扱うことになる。個人的には(あくまで私見ですが)、自動寿命で定義されたデータは、前の2つのタイプの長所をうまく組み合わせて、短所をなくしていると考えています。自動ポインターで定義されたデータは、静的なデータと同様に予測可能で安全でありながら、動的な手動制御のデータと同様に柔軟である。予測可能というのは、ポインタービットのチェックを追加で行う必要がなく、前に誰かがデータを削除してしまったのではないかと思うようなシナリオのことを指します。柔軟性とは、自動ポインタによって参照されるデータを、通常のポインタと同様に、関数に渡したり、配列の場合は再利用したりして扱うことができるシナリオのことである。

今言ったことを説明するために、Ihor Heraskoが提供した最初のコードと、私がPOINTER_AUTOMATIC用に書いた同じコードを比較してみてください。余分なチェックや初期化もなく、オペレーターの削除も60,000,000回ありません。これにより、時間、労力、そして重要な資源を節約することができます。これを理解すれば、ポインターを扱う必要はほとんどない。この作業を最小化するか、全く残らないようなアルゴリズムをいつでも書くことができるのです。例えば、私は自分のコードでオブジェクトを手動で処理することはありません。静的配列については、例えば、プログラムに必要なデータを縫い込むために使わなければならないこともありますが、それはとても特殊なことで、普通のユーザーは必要ないと思います。CArrayObjのような既成のコレクションを使うか、自作するのがベストです。今はテンプレートとMQLの機能で、静的な配列よりもかなり柔軟なものを作ることができます。

 
エムクールにはゴミ箱がありません。
 

Vasiliy Sokolov #:

静的な定義済みのデータ。コンパイル時にプログラムに縫い込まれ、もはや修正されることはない。こ れらは、あるプライベートなメモリ領域に格納されています。例えば、char[1024]のような静的配列である。

配列が初期化されていない場合。

int A[] = {1, 2}; // Инициализация
int B[2];         // Без инициализации

なぜ、EX5に書き込まなければならないのか?

 
fxsaber #:

配列が初期化されていない場合。

なぜ、EX5に縫い込まなければならないのか?

そうなんです、初期化されていないものはもちろん縫い付けられていないんです。初期化されたものはそうです。しかし、どちらのタイプもサイズはコンパイル時に定義され、もう変更されることはない。つまり、静的配列は条件付きで2つのグループに分けることができる。

 
Dmitry Fedoseev #:
エムクールにはゴミ回収業者がいません。

公式には、そうです。非公式には、多くのものがその存在を示しています。

  • MQLにはポインターがありません。その代わり、よく似たものに置き換わっています。
  • MQLでは、例えばC言語のような直接的なメモリ割り当てはありません。
  • MQLのプログラムは、ある仮想マシンで実行されます。レナートはそのことを簡潔に、一度も書かなかった。
  • 自動的に解放されるクラスインスタンスを定義することができます。そこで、これらのインスタンスを監視し、必要なときに解放する何らかの仕組みが必要です。それがゴミ収集人でなくて何なのか?
  • ポインタを通じて初期化され、適切に解放されないインスタンスは、終了時にリークオブジェクトとしてマークされます。その数と失われたメモリーの総容量が表示されます。リークしたメモリがあるプログラムは、Marketで検証すらされません。したがって、手動で割り当てられたものであっても、すべてのオブジェクトがシステムに計上され、知られており、知られている。これは、ゴミ収集員が解決する典型的な仕事の一つである。