mql5言語の特徴、微妙なニュアンスとテクニック - ページ 110

 

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

バグ、バグ、質問

fxsaber さん 2018.12.01 11:15

スーパーブレーキデザイン
string Str[];
const int handle = FileOpen(FileName, FILE_READ | FILE_ANSI | FILE_TXT);  

FileReadArray(handle, Str);

100万行の40Mbのファイルを読むのに18秒かかる。


同じ出力結果でも、やり方が違う

  uchar Bytes[];
  const int handle = FileOpen(FileName, FILE_READ | FILE_BIN);
  
  FileReadArray(handle, Bytes);

  string Str[];
  StringSplit(CharArrayToString(Bytes), '\n', Str);

すでに0.5秒で終了しています。


 
コンパイルするための人工的なトリック
#define  MACROS(A, B) A / B + !(A / B) // (A >= B) ? A / B : 1

template <typename T1, typename T2>
union UNION
{
  T1 a;
//  T2 b[sizeof(T1) / sizeof(T2)];      // '[' - invalid index value
  T2 b[MACROS(sizeof(T1), sizeof(T2))]; // OK
};

template <typename T1, typename T2>
void f()
{
  if (sizeof(T1) >= sizeof(T2))
    UNION<T1, T2> Union;
  else
    UNION<T2, T1> Union;  
}

void OnStart()
{
  f<int, char>();
}
 

auto_ptr (廃止予定) の単純な対応版。注:全く類似していない、である。
...


https://habr.com/post/140222/

Smart pointers для начинающих
Smart pointers для начинающих
  • habr.com
Эта небольшая статья в первую очередь предназначена для начинающих C++ программистов, которые либо слышали об умных указателях, но боялись их применять, либо они устали следить за new-delete. UPD: Статья писалась, когда C++11 еще не был так популярен. Итак, программисты С++ знают, что память нужно освобождать. Желательно всегда. И они знают...
 

pavlick_

operator=に冒頭の1行を追加する必要があります。

if (p==other.p) return &this;
 

こんな感じに限定した方がいいかもしれませんが(コピーは一切できません)。

template <typename T_>
class unique_ptr{
   T_ *p;
public:
   unique_ptr(void *ptr=NULL): p(ptr)           {}
   ~unique_ptr()                                {reset();}
   unique_ptr *operator=(T_ *p_)                {reset(); p = p_; return &this;}
   // releases ownership of the managed object
   T_ *release()                                   {T_ *r = p; p = NULL; return r;}
   // destroys the managed object 
   void reset()                                    {if(p) delete p; p=NULL;}
   // returns a pointer to the managed object 
   T_ *get()                                       {return p;}
   unique_ptr(const unique_ptr<T_> &other);
   void operator=(const unique_ptr<T_> &other);
   void swap(unique_ptr<T_> &other){
      T_ *buf = p;
      p = other.p;
      other.p = buf;
   }
};
なぜ、auto_ptrのコピーにしたのか?スタックオブジェクトをCArrayObjに コピーするには、コンストラクタを何度も呼び出してオブジェクトを大量に作成する必要があるため、µlの曲率のせいです。でも、それに見合うだけの価値があるとは思えません。この点、最初の投稿は取り下げます。
 
pavlick_:

なぜ、auto_ptrのコピーにしたのか?スタックオブジェクトをCArrayObjにコピーするには、コンストラクタを何度も呼び出してオブジェクトを大量に作成する必要があります。

また、なぜ「μlの曲率」なのでしょうか?

 
Alexey Navoykov:

また、なぜ「μlの曲がり角」なのでしょうか?

スタックオブジェクトのコピーを配列に追加するという些細な作業は、デフォルトのコンストラクタを追加することですが、これはそもそも必要ないことでした。

class Q : public CObject {
public:
   Q() {}
   Q(int i) {}
};

void OnStart()
{
   CArrayObj ar;
   Q q(3);
   
   Q *new_el = new Q;
   new_el = q;
   ar.Add(new_el);
   Q new_el2(5);
   q = new_el2;
}

致命的ではない、そう、Qでinit()をすれば、少しは問題がスムーズになるのだが、それでも-嫌な感じだ。また、手元でauto_ptrをコピーする場合、すべてが2行で行われますが、その労力に見合うだけのゲームにはなっていません。おそらく、こだわりすぎ、完璧主義なのでしょう。

 
pavlick_:

スタックオブジェクトのコピーを配列に追加するという些細な作業が、こうなることが判明 + デフォルトコンストラクタを規定する必要があるが、これは全く必要なかった。

致命的ではない、そう、Qでinit()をすれば、少しは問題がスムーズになるが、それでも嫌なものだ。また、手元でauto_ptrをコピーする場合、すべてが2行で行われますが、その労力に見合うだけのゲームにはなっていません。おそらく、こだわりすぎ、完璧主義なのでしょう。

しかし、C++でも全く同じなので、なぜ曲がったmcl.が出てくるのかはよくわかりません。

また、あなたの場合、コピーコンストラクタを指定して、一行で要素を追加する方が簡単です。

ar.Add(new Q(q));
 
pavlick_:

スタックオブジェクトのコピーを配列に追加するという些細な作業が、こうなることが判明 + デフォルトコンストラクタを書く必要があるが、全く必要ないことが判明。

致命的ではない、そう、Qでinit()をすれば、少しは問題がスムーズになるが、それでも嫌なものだ。また、auto_ptrをコピーしているときは、すべてが2行で行われますが、その労力に見合うだけのゲームにはなっていません。おそらく、こだわりすぎ、完璧主義なのでしょう。

そうやって、auto_ptrの後ろに隠れているだけなのです...。

ここでは特別な問題はないと思います。

C#のようにメモリを自動的に削除するようなやり方は、古株の私としてはとても嫌なのです。私の考えでは、オブジェクトの削除を依頼した人が責任を負うべきであり、一部の「ゴミ収集人」が責任を負うべきものではありません。

 
Alexey Navoykov:

しかし、C++でも全く同じなので、なぜmclが曲がっているのかがよくわからない。

また、あなたの場合、コピーコンストラクタを指定して、1行で要素を追加する方が簡単です。

どう同じなのでしょうか?そこには自動的にコピーコンストラクタがあり、すべての操作はルックを持つことになる。

class Q : public CObject {
public:
   Q(int i) {}
};

void OnStart()
{
   CArrayObj ar;
   Q q(3);
   
   ar.Add(new(q));
   q = Q(5);
}

また、あなたの場合、コピーコンストラクタの設定と要素の追加を一行で行う方が簡単です

もちろん、例えばおもちゃのクラスで、現実にはデータもある程度、おそらく大量にあるのだから、コピー用のコンストラクタを書くという選択肢は全くない。ラッパーで適材適所を包み、カスタムコンストラクタは不要。

つまり、auto_ptrの後ろに隠されているだけで全ては起こるのです...。

ここは特に問題ないと思います。

C#のようにメモリが自動的に削除される方式は、古株の私としては好きではありません。私の考えでは、オブジェクトの削除を依頼した人が責任を持つべきで、どこかのゴミ収集人ではないはずです。

μlでは、スマートポインタはなくても大丈夫です。ゴミ収集器 !=スマートポインタ、少なくとも例外があるからなくても困らない。私自身、ゴミ収集係は好きではありません。

理由: