对OOP的帮助 - 页 5

 

我也需要在这里写点东西......

我的代码中就有这样的东西。

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

T是int类型。

调试下函数10*1024*1024次的执行时间:214.659毫秒。

没有调试: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,你还会其他的编程语言吗?不,你不知道。而且你仍然没有学会如何使用对象和指针,从你发表的那几段代码甚至文章中可以看出。这就是为什么我甚至不能认真地回复这个无能和坦率的愚蠢评论。最后读读维基百科,了解一下什么是垃圾收集器,以及它是如何组织的,最后至少读一遍你想参考的内容。到目前为止,这一切看起来就像狗对大篷车的吠叫:毫无意义, 毫不留情。

先处理好你自己的蟑螂。这很有趣,你太不够意思了。这是我的谦虚))。

你不能认真地回答任何问题,因为你根本不能认真地回答任何问题,因为你是泥腿子。

瓦西里,你真的不够格。毕竟,这种关于垃圾收集者的谈话是一年前的事,如果不是更久的话。它仍然在那里。

你在一年内还没有弄清楚它是什么。我的意思是,我不知道你是否知道它是什么,但你在这里展示了

你不明白,平庸的,谈话的主题,而且你自相矛盾。而令人惊奇的是,你似乎至少知道

两种语言,其中一种有垃圾收集器,即使如此,你也不知道有垃圾收集器的语言之间的区别。

和一种没有垃圾收集者的语言。

并回答你的话--告诉我,我怎么不知道如何与对象和指针一起工作?

 
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