OOP에 대한 도움말 - 페이지 5

 

여기에 뭔가를 써야하는데...

내 코드에 다음과 같은 것이 있습니다.

   union u_Data_t
     {
      T value ;
       ulong data[ sizeof (T)/ 8 + 1 ];
     } data_t;

T는 int 유형입니다.

함수 실행 시간 디버그 214.659밀리초에서 10*1024*1024번

디버깅 없이: 13190.941 밀리초

여기에는 오류가 없으며 릴리스 버전이 훨씬 느립니다.

변수 선언을 약간 변경합니다 .

   static union u_Data_t
     {
      T value ;
       ulong data[ sizeof (T)/ 8 + 1 ];
     } data_t;

정적이 나타났다

디버그 중: 213.045 밀리초

미포함: 70.237 밀리초

 
Vasiliy Sokolov # :
Dmitry, 실례합니다. mukl 이외의 프로그래밍 언어를 하나 이상 알고 있습니까? 아니, 당신은하지 않습니다. 그리고 그들은 여전히 객체와 포인터로 작업하는 방법을 배우지 못했습니다. 이것은 여러분이 게시한 몇 가지 코드와 기사에서도 분명합니다. 그래서 저는 이 천박하고 솔직하게 바보 같은 댓글에 진지하게 대답조차 할 수 없습니다. 글쎄, 마지막으로 Wikipedia나 뭔가를 읽고, 가비지 수집기가 무엇인지, 어떻게 작동하는지 읽고, 참조하려는 내용을 한 번 이상 읽으십시오. 그 동안에는 모든 것이 캐러밴에서 개가 짖는 것처럼 보입니다. 무분별하고 무자비합니다.

바퀴벌레를 먼저 처리하십시오. 웃기네요, 당신은 너무 터무니없이 부족합니다. 그리고 겸손하게 넣었습니다))

아무 것도 진지하게 대답할 수 없고 진지하게 대답할 수 없기 때문에 진흙투성이이기 때문입니다.

Vasily, 당신은 정말 부족합니다. 결국, 가비지 수집기에 대한 이 대화는 1년 전의 것입니다. 그리고 변한 것은 없다.

당신은 그것이 무엇인지 1 년 동안 담배를 피우지 않았습니다. 글쎄, 나는 과학적으로 초월적인 것을 피우지 않을 것이지만 당신은 여기에서 시연했습니다.

술에 취하지 않는다는 것, 진부한 대화의 주제, 그리고 스스로 모순되는 것. 그리고 놀라운 점은 당신이 적어도

두 가지 언어, 그 중 하나는 가비지 수집기 포함

그리고 가비지 컬렉터가 없는 언어.

그리고 당신의 말에 대한 대답 - 내가 개체와 포인터로 작업할 수 없는 곳을 보여주시겠습니까?

 
Aliaksandr Hryshyn # :

릴리스 버전은 훨씬 느립니다.

플레이할 준비가 되었나요?

 
fxsaber # :

플레이할 준비가 되었나요?

 //+------------------------------------------------------------------+
//|                                                        cBool.mqh |
//|                                               Aliaksandr Hryshyn |
//|                           https://www.mql5.com/ru/users/greshnik1 |
//+------------------------------------------------------------------+
#property copyright "Aliaksandr Hryshyn"
#property link        " https://www.mql5.com/ru/users/greshnik1 "

//Битовый поток
class cBit_thread
  {
private :
   ulong              _bit_thread[]; //Битовый поток данных
   uint               _bit_thread_size; //Количество записанных бит в потоке
   uint               _bit_thread_pos; //Текущя позиция для чтения/записи
public :
   //Запись последовательности бит
   //Размер увеличивается динамически
   template < typename T>
   int                Write(
       const T value, //Простая структура или переменная
       uint pos_bit_read= 0 , //С какой позиции начать считывание из структуры/переменной.Указывается в битах
       int bits_count=- 1 //Количество бит. -1=все до конца
   ); //Возвращает количество записанных бит -1=ошибка
  };

template < typename T>
int cBit_thread::Write( const T value, uint pos_bit_read= 0 , int bits_count=- 1 )
  {
   static union u_Data_t
     {
      T value;
       ulong data[ sizeof (T)/ 8 + 1 ];
     } data_t;
   ZeroMemory (data_t.data);
   data_t.value=value;

   if (pos_bit_read>= sizeof (T)* 8 )
       return - 1 ;
   if (bits_count< 0 )
      bits_count= int ( sizeof (T)* 8 -pos_bit_read);
   else
       if (pos_bit_read+bits_count> sizeof (T)* 8 )
         return - 1 ;

   uint shift= int (pos_bit_read& 63 );
   int read_from= int (pos_bit_read>> 6 );

   int read_end= int (pos_bit_read+bits_count);
   uint write_to= 0 ;
   ulong l1= 0 ;
   for ( int i1=read_from; i1<(read_end>> 6 )+ 1 ; i1++,write_to++)
     {
      l1=data_t.data[i1];
      data_t.data[write_to]=l1>>shift;
       if (write_to> 0 )
         data_t.data[write_to- 1 ]|=l1<<( 64 -shift);
     }

   uint len1= ArrayRange (_bit_thread, 0 );
   uint len2b=_bit_thread_pos+bits_count;
   if (len2b+ 128 >(len1<< 6 ))
     {
      len2b=(len2b>> 6 )+ 2 ;
       ArrayResize (_bit_thread,len2b+ 1024 );
      len2b+= 1024 ;
       for ( uint i1=len1; i1<len2b; i1++)
         _bit_thread[i1]= 0 ;
     }
   int pos_end=(bits_count>> 6 )+((bits_count& 63 )!= 0 );
   shift=_bit_thread_pos& 63 ;
   write_to=(_bit_thread_pos>> 6 );
   if (shift== 0 )
     {
       for ( int i1= 0 ; i1<pos_end; i1++)
        {
         l1=data_t.data[i1];
         _bit_thread[write_to]|=l1;
        }
     }
   else
     {
       for ( int i1= 0 ; i1<pos_end; i1++)
        {
         l1=data_t.data[i1];
         _bit_thread[write_to]|=(l1<<shift);
         _bit_thread[write_to+ 1 ]|=l1>>( 64 -shift);
        }
     }
   _bit_thread_pos+=bits_count;
   _bit_thread_size= MathMax (_bit_thread_size,_bit_thread_pos);
   return bits_count;
  }
//+------------------------------------------------------------------+

그리고 스크립트:

 #include <cBool.mqh>
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart ()
  {
   cBit_thread thread;
   ulong mcs= GetMicrosecondCount ();
   int num= 1 ;
   for ( int i1= 0 ; i1< 10 * 1024 * 1024 ; i1++)
     {
      thread.Write(num, 0 , 1 );
     }
   Print (( GetMicrosecondCount ()-mcs)/ 1000.0 );
  }
 
아마도 누군가가 이것을 했습니까?
 
Aliaksandr Hryshyn # :

그리고 스크립트:

Release: 81.003
Debug: 295.312

문제가 보이지 않습니다.

 
fxsaber # :

문제가 보이지 않습니다.

최신 베타 3062

 
나는 229와 225를 가지고 있습니다 - 정확히 동일합니다.
 
Dmitry Fedoseev # :
나는 229와 225를 가지고 있습니다 - 정확히 동일합니다.

터미널 버전은 동일한가요?

 
Aliaksandr Hryshyn # :

터미널 버전은 동일한가요?

3061