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 еще не был так популярен. Итак, программисты С++ знают, что память нужно освобождать. Желательно всегда. И они знают...
 

파블릭_

operator=에서 시작 부분에 줄을 추가해야 합니다.

 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에 대한 사본을 만든 이유는 무엇입니까? µl의 곡률로 인해 스택 개체를 CArrayObj 에 복사하려면 생성자를 여러 번 호출하여 여러 개체를 만들어야 합니다. 하지만 그럴 가치가 없다고 생각합니다. 이와 관련하여 첫 번째 메시지를 철거하겠습니다.
 
pavlick_ :

auto_ptr에 대한 사본을 만든 이유는 무엇입니까? µl의 곡률로 인해 스택 개체를 CArrayObj에 복사하려면 생성자를 여러 번 호출하여 여러 개체를 만들어야 합니다.

그리고 왜 "곡률 mkl"입니까?

 
Alexey Navoykov :

그리고 왜 "곡률 mkl"입니까?

간단한 작업 - 스택 개체의 복사본을 배열에 추가하려면 다음이 + 필요하지 않은 기본 생성자를 작성해야 합니다.

 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이 있으면 모든 것이 두 줄로 이루어지지만 게임은 양초의 가치가 없습니다. 어쩌면 너무 까다롭고 완벽주의적일 수도 있습니다.

 
pavlick_ :

간단한 작업 - 스택 개체의 복사본을 배열에 추가하려면 다음이 + 필요하지 않은 기본 생성자를 작성해야 합니다.

치명적이지는 않습니다. 예, Q에서 init()를 수행하면 문제가 약간 완화되지만 여전히 혐오감을 유발합니다. 그리고 복사한 auto_ptr이 있으면 모든 것이 두 줄로 이루어지지만 게임은 양초의 가치가 없습니다. 어쩌면 너무 까다롭고 완벽주의적일 수도 있습니다.

그러나 결국 C ++에서는 모든 것이 정확히 동일하므로 곡선이 µl인 이유는 명확하지 않습니다.

그리고 귀하의 경우 복사 생성자를 설정하고 한 줄에 요소를 추가하는 것이 더 쉽습니다.

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

간단한 작업 - 스택 개체의 복사본을 배열에 추가하려면 다음이 + 필요하지 않은 기본 생성자를 작성해야 합니다.

치명적이지는 않습니다. 예, Q에서 init()를 수행하면 문제가 약간 완화되지만 여전히 혐오감을 유발합니다. 그리고 복사한 auto_ptr이 있으면 모든 것이 두 줄로 이루어지지만 게임은 양초의 가치가 없습니다. 어쩌면 너무 까다롭고 완벽주의적일 수도 있습니다.

어쨌든 모든 일이 발생합니다. auto_ptr 뒤에 숨겨져 있습니다...

여기에는 문제가 없습니다.

나는 굳은 방귀처럼 - 메모리가 자동으로 삭제되는 C # 접근 방식이 마음에 들지 않습니다. 나에 따르면 요청한 사람은 개체 삭제에 대한 책임이 있어야 하며 거기에 있는 "가비지 수집기"는 전혀 하지 않아야 합니다.

 
Alexey Navoykov :

그러나 결국 C ++에서는 모든 것이 정확히 동일하므로 곡선이 µl인 이유는 명확하지 않습니다.

그리고 귀하의 경우 복사 생성자를 설정하고 한 줄에 요소를 추가하는 것이 더 쉽습니다.

어떻게 똑같나요? 자동으로 복사 생성자가 있고 모든 조작은 다음과 같습니다.

 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 # 접근 방식이 마음에 들지 않습니다. 나에 따르면 요청한 사람은 개체 삭제에 대한 책임이 있어야 하며 거기에 있는 "가비지 수집기"는 전혀 하지 않아야 합니다.

마이크로 리터에서는 스마트 포인터 없이도 할 수 있습니다. 가비지 컬렉터 != 스마트 포인터, 예외 때문에 적어도 스마트 포인터 없이는 할 수 없습니다. 가비지 컬렉터도 싫다.

사유: