|
MadOuse
|
|
delete или new (typeid(void*))(void*)15.11.2010, 02:38. Показов 2336. Ответов 1
Метки нет (Все метки)
Доброе время суток.
Пишу список. Телом каждого элемента (el) списка является void указатель(body). (предполагается что тело элемента может быть любого типа, т.е. переменные, классы, другой такой же список и т.д.) Критерий - универсальность и скорость. У меня получилось что-то типа (*el).body = new typeid(NewType); где NewType - параметр функции, void * на какую либо известную переменную и delete * (typeid(((*el).body)*) ((*el).body); (- на это компилятор ругается) При работе каждый раз определяется тип указателя. Насколько это правильно / элегантно / быстро? Может есть получше варианты? |
|
| 15.11.2010, 02:38 | |
|
Ответы с готовыми решениями:
1
Void menu(void); что это ? почему не void menu();
Delete void* |
|
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
|
||||||||||||
| 15.11.2010, 06:27 | ||||||||||||
Сообщение было отмечено как решение
Решение
Если тебе нужна скорость, то делай с прямыми данными в теле. А универсальность на такой класс навешивается с помощью шаблонов: делаешь шаблон класса, в нём объявляешь параметр-базовый типа списка, тело объявляешь базового типа, а потом под каждый востребованный тип создаёшь отдельную версию класса списка. А с телом-указателем получишь искусственные тормоза даже в том случае, если этот указатель типизированный. Для нетипизированного же они ещё увеличиваются. Типизированный создаёт дополнительные тормоза только на косвенной адресации: лишние операции загрузки адреса и доступа по нему. А нетипизированный при каждом использовании требует указателей на функции сравнения, сложения, вычитания, умножения, деления, копирования, выделения и освобождения памяти, а загрузка и вызов этих адресов даёт самые капитальные тормоза из всех, что вообще можно навешать на элемент данных. Если же тебе нужна универсальность в пределах каждого списка (один элемент содержит double, другой char) то сделай абстрактный класс элемента списка вообще без тела, а от него уже наследуй элементы с каждым конкретным типом тела. Причём, все указатели на соседа должны быть объявлены как указатели на базовый класс данной иерархии (на элемент без тела).
Добавлено через 3 минуты
Добавлено через 2 минуты
Добавлено через 3 минуты Но самые большие тормоза всё равно идут от самой структуры списка: для каждого доступа к элементу надо перебрать все элементы между началом списка и требуемым элментом, каждый раз загружая адрес соседа, осуществляя доступ по этому адресу, да ещё и в цикле. Добавлено через 13 минут Лучше всего сделать динамический массив со счётчиком элементов и внутренней реализацией на основе непрерывного блока указателей на абстрактный класс без данных. При фактическом размещении данных в элементе массива, этому элементу присваивается значение указателя на потомка этого базового абстрактного класса. Добавлено через 5 минут Остаются те же тормоза типизированных указателей, но всего двух (один вычисляемый на основе указателя на начало блока) вместо длинной цепочки согласно структуре списка, искусственно удлиняемой ещё на один указатель в теле элемента. Добавлено через 3 минуты В итоге это будет работать быстрее, чем доступ к шестому элементу списка с телом-типизированным указателем или к седьмому элементу списка с прямыми данными в теле. А если в теле элемента списка валяется void*, то уже на первом элементе тормозов будет больше. Добавлено через 4 минуты В массиве же можно, не увеличивая времени доступа, хранить миллиарды элементов (лишь бы хватило памяти), что даже при прямых данных в теле элемента списка даёт секунды (если не часы, сутки или даже годы) на доступ к среднему элементу. Добавлено через 5 минут Свой вариант тоже доделай. Потом запихай в список и в массив по миллиону элементов и погоняй тест в миллион операций рандомного доступа туда и туда с засеканием общего времени.
0
|
||||||||||||
| 15.11.2010, 06:27 | |
|
Помогаю со студенческими работами здесь
2
Delete void* p = new classobject();
error C2440: 'delete' : cannot convert from 'Song' to 'void *' Что значит void(*f)()=(void(*)()func? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|