Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
MadOuse
0 / 0 / 0
Регистрация: 11.11.2010
Сообщений: 1
#1

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

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

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

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

Void menu(void); что это ? почему не void menu();
void menu(void); что это ? почему не void menu(); void naprimer(void); и это...

Delete void*
Безопасно ли удалять указатель на тип void. Допустим есть такой код: void *...

Delete void* p = new classobject();
Всем доброго вечера! Возник вопрос, подскажите пожалуйста. Допустим: void* p...

Дважды вычислить значение выражения, используя функции возвращающие void и не void
Хай!Помогите решить Дважды вычислить значение выражения, используя ...

Typedef void (WINAPI *GLEND)(void), как вызывать?
импортирую метод GLEND glmethod = (GLEND) GetProcAddress(hModule, "glEnd"); ...

1
taras atavin
4204 / 1763 / 212
Регистрация: 24.11.2009
Сообщений: 27,565
15.11.2010, 06:27 #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 минут
Свой вариант тоже доделай. Потом запихай в список и в массив по миллиону элементов и погоняй тест в миллион операций рандомного доступа туда и туда с засеканием общего времени.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2010, 06:27
Привет! Вот еще темы с решениями:

error C2440: 'delete' : cannot convert from 'Song' to 'void *'
Строка, где выдаётся ошибка: delete mas; Деструктор: Song::~Song () {...

Что значит void(*f)()=(void(*)()func?
void(*f)()=(void(*)())func; Объясните, пожалуйста, что значит этот код.

Error C2084: функция "void mehanizm:print(void)" уже имеет текст реализации
Добрый день, я столкнулся с проблемой вывода элемента на экран, выбивает:...

LNK2019: ссылка на неразрешенный внешний символ "void __cdecl run(void)" (?run@@YAXXZ) в функции _wmain
#include "stdafx.h" #include "iostream" #include "cmath" using namespace...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru