Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
MadOuse
Сообщений: n/a
#1

delete или new (typeid(void*))(void*) - C++

15.11.2010, 02:38. Просмотров 1404. Ответов 1
Метки нет (Все метки)

Доброе время суток.
Пишу список. Телом каждого элемента (el) списка является void указатель(body). (предполагается что тело элемента может быть любого типа, т.е. переменные, классы, другой такой же список и т.д.)
Критерий - универсальность и скорость.

У меня получилось что-то типа
(*el).body = new typeid(NewType);
где NewType - параметр функции, void * на какую либо известную переменную
и delete * (typeid(((*el).body)*) ((*el).body); (- на это компилятор ругается)
При работе каждый раз определяется тип указателя.
Насколько это правильно / элегантно / быстро? Может есть получше варианты?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.11.2010, 02:38     delete или new (typeid(void*))(void*)
Посмотрите здесь:

void C++
void C++
C++ Ошибка void
C++ error C2440: 'delete' : cannot convert from 'Song' to 'void *'
Union с явными указателями или void*- что выбрать? C++
C++ Void
Delete void* p = new classobject(); C++
C++ Функция void
C++ ошибка void
Typedef void (WINAPI *GLEND)(void), как вызывать? C++
Void vs bool или что то похожие C++
C++ Использование int или void в качестве возвращаемого типа для main()

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
15.11.2010, 06:27     delete или new (typeid(void*))(void*) #2
Если тебе нужна скорость, то делай с прямыми данными в теле. А универсальность на такой класс навешивается с помощью шаблонов: делаешь шаблон класса, в нём объявляешь параметр-базовый типа списка, тело объявляешь базового типа, а потом под каждый востребованный тип создаёшь отдельную версию класса списка. А с телом-указателем получишь искусственные тормоза даже в том случае, если этот указатель типизированный. Для нетипизированного же они ещё увеличиваются. Типизированный создаёт дополнительные тормоза только на косвенной адресации: лишние операции загрузки адреса и доступа по нему. А нетипизированный при каждом использовании требует указателей на функции сравнения, сложения, вычитания, умножения, деления, копирования, выделения и освобождения памяти, а загрузка и вызов этих адресов даёт самые капитальные тормоза из всех, что вообще можно навешать на элемент данных. Если же тебе нужна универсальность в пределах каждого списка (один элемент содержит double, другой char) то сделай абстрактный класс элемента списка вообще без тела, а от него уже наследуй элементы с каждым конкретным типом тела. Причём, все указатели на соседа должны быть объявлены как указатели на базовый класс данной иерархии (на элемент без тела).

Добавлено через 3 минуты
Цитата Сообщение от MadOuse Посмотреть сообщение
C++
1
(*el).body = new typeid(NewType);
Если указатель на воид, то
C++
1
 (*el).body = new void*;
.

Добавлено через 2 минуты
C++
1
typeid
можно использовать только с типизированным указателями на класс - член иерархии классов.

Добавлено через 3 минуты
Но самые большие тормоза всё равно идут от самой структуры списка: для каждого доступа к элементу надо перебрать все элементы между началом списка и требуемым элментом, каждый раз загружая адрес соседа, осуществляя доступ по этому адресу, да ещё и в цикле.

Добавлено через 13 минут
Лучше всего сделать динамический массив со счётчиком элементов и внутренней реализацией на основе непрерывного блока указателей на абстрактный класс без данных. При фактическом размещении данных в элементе массива, этому элементу присваивается значение указателя на потомка этого базового абстрактного класса.

Добавлено через 5 минут
Остаются те же тормоза типизированных указателей, но всего двух (один вычисляемый на основе указателя на начало блока) вместо длинной цепочки согласно структуре списка, искусственно удлиняемой ещё на один указатель в теле элемента.

Добавлено через 3 минуты
В итоге это будет работать быстрее, чем доступ к шестому элементу списка с телом-типизированным указателем или к седьмому элементу списка с прямыми данными в теле. А если в теле элемента списка валяется void*, то уже на первом элементе тормозов будет больше.

Добавлено через 4 минуты
В массиве же можно, не увеличивая времени доступа, хранить миллиарды элементов (лишь бы хватило памяти), что даже при прямых данных в теле элемента списка даёт секунды (если не часы, сутки или даже годы) на доступ к среднему элементу.

Добавлено через 5 минут
Свой вариант тоже доделай. Потом запихай в список и в массив по миллиону элементов и погоняй тест в миллион операций рандомного доступа туда и туда с засеканием общего времени.
Yandex
Объявления
15.11.2010, 06:27     delete или new (typeid(void*))(void*)
Ответ Создать тему
Опции темы

Текущее время: 01:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru