Особенности языка mql5, тонкости и приёмы работы - страница 314

 
Vladimir Pastushak #:

Друзья, напомните пожалуйста, где то читал про конструкторы и деструкторы. Порядок создания и уничтожения, но никак не могу найти...

Нужно ли в потомке вызывать конструктор родителя?

Нужно ли в потомке вызывать деструктор родителя? 


Покажите примеры пожалуйста пару примеров, особенно про уничтожение.

в потомке надо указывать который из конструкторов родителя используется.

class Child: public Parent { 
 // construct
 Child(double arg):Parent() {

 }
 // copy cons
 Child(const Child &orig):Parent(orig) {
 }
 ~Child() {
 }

}

в деструкторах ничего такого писать и указывать не надо

 
Vladimir Pastushak #:

Нужно ли в потомке вызывать конструктор родителя?

Нужно ли в потомке вызывать деструктор родителя?

Во всех конструкторах/деструкторах пропишите эту строку.

::Print(__FUNCSIG__);

Тогда в логе увидите последовательность всех вызовов. И картина сложится.

 
fxsaber #:

Во всех конструкторах/деструкторах пропишите эту строку.

Тогда в логе увидите последовательность всех вызовов. И картина сложится.

или сломается :-)

когда без предупреждений и объявления войны вызовется "конструктор по умолчанию"..

PS/ С++, Pascal, всё равно что, но должны быть ДО mql. 

 
Maxim Kuznetsov #:

PS/ С++, Pascal, всё равно что, но должны быть ДО mql.

Знаю только MQL5 - норм. полет.

 

Оптимальный тип массива для чтения байтовой информации - uint[].

uint Calc( uint Num ) { return((Num & 0xFF) + ((Num >>= 8) & 0xFF) + ((Num >>= 8) & 0xFF) + (Num >>= 8)); }

void OnStart()
{
  uchar Array1[];
  uint Array2[];
  
  const int Size1 = ArrayResize(Array1, INT_MAX / sizeof(uint) * sizeof(uint));
  const int Size2 = ArrayResize(Array2, Size1 / sizeof(uint));
  
  const uchar Tmp = 1;  
  ArrayInitialize(Array1, Tmp);
  ArrayInitialize(Array2, ((uint)Tmp << 24) | ((uint)Tmp << 16) | ((uint)Tmp << 8) | Tmp);
  
  {
    const ulong StartTime = GetMicrosecondCount();
    uint Sum = 0;
    
    for (int i = 0; i < Size1; i++)
      Sum += Array1[i];
    
    Print(GetMicrosecondCount() - StartTime); // 1171900
    Print(Sum);
  }

  {
    const ulong StartTime = GetMicrosecondCount();
    uint Sum = 0;
    
    for (int i = 0; i < Size2; i++)
      Sum += Calc(Array2[i]);
    
    Print(GetMicrosecondCount() - StartTime); // 796638
    Print(Sum);
  }
}

Интересно, что AVX-код выполняется медленнее x64-кода.

 
fxsaber #:

Интересно, что AVX-код работает медленнее, чем x64-код.

С оптимизацией компилятора?
 
fxsaber #:

Оптимальным типом массива для чтения байтовой информации является uint[].

Попробуйте использовать ulong.
 
Alain Verleyen #:
С оптимизацией компилятора?

Да.

Alain Verleyen #:
Попробуйте использовать ulong.

Пробовал различные варианты: ulong, struct, union. Лучшие из низ показывали производительность, как uint.

 
fxsaber #:

Да.

Я пробовал разные варианты: ulong, struct, union. Лучший из низ показал производительность как uint.

2025.10.29 08:53:45.911 393227-3143 (EURUSD,H1) X64 Regular UCHAR: 391609 : 2147483640
2025.10.29 08:53:46.198 393227-3143 (EURUSD,H1) X64 Regular UINT: 287708 : 2147483640
2025.10.29 08:53:46.487 393227-3143 (EURUSD,H1) X64 Regular UNION32: 288293 : 2147483640
2025.10.29 08:53:46.681 393227-3143 (EURUSD,H1) X64 Regular UNION64: 193904 : 2147483640
2025.10.29 08:53:46.928 393227-3143 (EURUSD,H1) X64 Regular ULONG: 246861 : 2147483640

2025.10.29 08:55:48.715 393227-3143 (EURUSD,H1) AVX UCHAR: 401309 : 2147483640
2025.10.29 08:55:49.005 393227-3143 (EURUSD,H1) AVX UINT: 290088 : 2147483640
2025.10.29 08:55:49.296 393227-3143 (EURUSD,H1) AVX UNION32: 290388 : 2147483640
2025.10.29 08:55:49.490 393227-3143 (EURUSD,H1) AVX UNION64: 194669 : 2147483640
2025.10.29 08:55:49.756 393227-3143 (EURUSD,H1) AVX ULONG: 265811 : 2147483640

Файлы:
 
Я не вижу никакого кода векторизации массивов. Поэтому AVX не уменьшил время выполнения