Не кидайте камнями

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
pivalexander
299
pivalexander  
CMyObject        *arrMyObjects[];
int n = ArraySize(arrMyObjects);
ArrayResize(arrMyObjects, n + 1);
arrMyObjects[n] = new CMyObject();


CMyObject        arrMyObjects[];
int n = ArraySize(arrMyObjects);
ArrayResize(arrMyObjects, n + 1);

Массив указателей и  массив самих объектов, в чем преимущество/недостатки первого и второго способа? 

Во втором способе если надо то тоже можно получить указатель на объект с помощью GetPointer()

Vladimir Simakov
5986
Vladimir Simakov  
pivalexander:


Массив указателей и  массив самих объектов, в чем преимущество/недостатки первого и второго способа? 

Во втором способе если надо то тоже можно получить указатель на объект с помощью GetPointer()

Если у тебя массив объектов, то для того, чтобы удалить элемент из массива, надо в самом объекте оператор = перегружать, чтобы arr[i]=arr[i+1] сделать, а это потенциальный баг (тупо добавил поле, а в оперторе = не добавил его копирование), да и каждый раз накладно создавать новые объекты.

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

Я для себя связанный список реализовал. В стандартной библиотеке тоже такой вроде есть.

pivalexander
299
pivalexander  
Vladimir Simakov:

Если у тебя массив объектов, то для того, чтобы удалить элемент из массива, надо в самом объекте оператор = перегружать, чтобы arr[i]=arr[i+1] сделать

Про оператор не понял

 arr[i]=arr[i+1]  объект не получится так скопировать?

Vladimir Simakov
5986
Vladimir Simakov  
pivalexander:

Про оператор не понял

 arr[i]=arr[i+1]  объект не получится так скопировать?

Нет, если для объекта нет оператора =
Georgiy Merts
9190
Georgiy Merts  
pivalexander:
   

Массив указателей и  массив самих объектов, в чем преимущество/недостатки первого и второго способа? 

Во втором способе если надо то тоже можно получить указатель на объект с помощью GetPointer()

По мне - так особой разницы нет. В случае массива указателей - надо несколько больше действий по созданию и удалению объектов.

Обычно использую массив указателей, поскольку в этом случае в массиве могут быть нулевые указатели. В случае массива объектов так не выйдет.

Alexey Volchanskiy
27275
Alexey Volchanskiy  
Georgiy Merts:

По мне - так особой разницы нет. В случае массива указателей - надо несколько больше действий по созданию и удалению объектов.

Обычно использую массив указателей, поскольку в этом случае в массиве могут быть нулевые указатели. В случае массива объектов так не выйдет.

В случае массива объектов тебе придется физически сдвигать все объекты при удалении или добавлении одного в середине. Ужос.

Vladimir Simakov
5986
Vladimir Simakov  
Alexey Volchanskiy:

В случае массива объектов тебе придется физически сдвигать все объекты при удалении или добавлении одного в середине. Ужос.

Вот-вот. Сначала новый копируются поля из старого в новый, и так до конца массива, потом "убивается" последний элемент массива. А это все такты, такты, много тактов процессора.

Vladimir Simakov
5986
Vladimir Simakov  

Еще момент. Есть массив из N объектов и ты хочешь добавить еще один. Вроде ничего особенного, но может случиться следующее. Не занятой памяти после конца массива (вы же знаете, что элементы массива идут в памяти друг за другом?) не хватает для очередного элемента, соответственно что происходит? Менеджер памяти ищет новый свободный участок в куче для размещения массива и, после этого копирует на новое место весь массив освобождая предыдущее. Опять время.

Поэтому массивы объектов в mql ну не смотрится совершенно, только указателей. Тут уже, даже если не заморачиваться с реализациями а-ля std::vector или std::list, накладных расходов всяко меньше.

Alexey Volchanskiy
27275
Alexey Volchanskiy  
Vladimir Simakov:

Вот-вот. Сначала новый объект аллоцируется, потом копируются поля из старого в новый, потом "убивается" старый. А это все такты, такты, много тактов процессора.

Ага, вывод для ТС: лучше с указателями.

Igor Makanu
9589
Igor Makanu  
Alexey Volchanskiy:

В случае массива объектов тебе придется физически сдвигать все объекты при удалении или добавлении одного в середине. Ужос.

используйте списки CList, вот я себе шаблон на основе CList сделал - можно хранить любые обьекты, минимум модификации https://www.mql5.com/ru/forum/85652/page16

Alexey Volchanskiy
27275
Alexey Volchanskiy  
Igor Makanu:

используйте списки CList, вот я себе шаблон на основе CList сделал - можно хранить любые обьекты, минимум модификации https://www.mql5.com/ru/forum/85652/page16

А ты сравни скорость доступа к элементу Clist со скоростью доступа к элементу массива )) Может, я помешан на скорости, это есть такое, но медленнее на порядок или более.

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий