Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.53/34: Рейтинг темы: голосов - 34, средняя оценка - 4.53
0 / 0 / 0
Регистрация: 11.11.2017
Сообщений: 50

Дорого ли приведение указателей?

14.11.2019, 18:19. Показов 7370. Ответов 55
Метки c++ (Все метки)

Студворк — интернет-сервис помощи студентам
Я не встретил эту тему в инете(именно про указатели, а не просто типы), но если она есть, дайте ссылку. На сколько дорога операция приведения указателя в стиле СИ? К примеру, есть два класса, один наследует другой. Дорого ли приведение указателя из указателя на родительский класс на указатель на дочерний? Я знаю, что указатель—это обычный int, который система принимает за адрес в памяти. Переменная, содержащая в себе указатель на объект представляет из себя int со значением вида 0x7f84a41000c0. Тогда, по идее, это не дорого для процессора. Я прав?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.11.2019, 18:19
Ответы с готовыми решениями:

Приведение указателей
В функции в качестве параметра передаю указатель на один из самых базовых классов . Затем в функции вызываю функцию, которой нет в базовом...

Приведение указателей
Вопрос немного из другого раздела, но тем не менее, вопросы не по поводу WinApi, а поводу приведения указателей. В WinApi есть функция...

приведение типов указателей
Задача у меня простая. Нужно побитно оперировать с числом unsigned int и на каких-то этапах заносить его в массив. для начала я решил,...

55
0 / 0 / 0
Регистрация: 11.11.2017
Сообщений: 50
18.11.2019, 20:30  [ТС]
Студворк — интернет-сервис помощи студентам
IGPIGP COKPOWEHEU, да, извините, я забыл добавить про наследование и виртуальные методы(я даже не подумал о виртуальной таблице). То есть, я хотел сказать про привидение указателя из родительского класса на дочерний при наличии виртуальных методов.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Если у класса есть виртуальные методы, то есть те, которые перекрываются методами потомка, в классе используется виртуальная таблица методов (вот тут в терминоголии могу наврать, надеюсь меня поправят), и вызов метода пройдет в два этапа: переход на таблицу, а потом из нее на реальный метод. И вот здесь уже может быть потеря производительности. Плюс при наследовании может быть нужно определить реальный тип потомка из родительского указателя, это тоже не решается на этапе компиляции, а значит отнимет какое-то время.
То есть само по себе приведение указателей бесплатное. Но вот доступ к объекту по указателю может оказаться чуть дороже, чем ожидалось.
. Да, теперь я понял все. То есть, основная задержка из-за виртуальных методов.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Dimgo2, это не делается в силе С (reinterpret_cast<>). Тут применяют static_cast<> или dynamic_cast<> в зависимости от того, какая стоит задача.
Хм, странно, что в учебнике Стивена Прата "Язык программирования c++"довольно часто используется Си приведение. Если я правильно понимаю, static_cast в данном случае является самым быстрым приведением(не включая reinterpret_­cast и опасные методы, которые могут лопнуть в runtime при нормальных условиях)? Мне нужны минимальные потери(раньше было ошибочное мнение, что Си приведение легче чем static_cast, ведь это чистая Си )
Цитата Сообщение от IGPIGP Посмотреть сообщение
Не вникая в тонкости реализации можно полагаться на общее мнение о том, что RTTI дорогая процедура, а dynamic_cast<> - один из способов выяснения по RTTI.
Да, я знаю. Но есть же способ при использовании typeid(если классов не много(3), то можно и его использовать, хоть Стивен Прата пишет, что это неправильно).
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
18.11.2019, 21:08
Цитата Сообщение от Dimgo2 Посмотреть сообщение
То есть, я хотел сказать про привидение указателя из родительского класса на дочерний при наличии виртуальных методов.
Вы так говорите, что непонятно кто на ком стоял. Родительский указатель в дочерний преобразуется автоматически. Наличие виртуальных методов не имеет значения. Дочерний в родителя это сужающее преобразование чреватое неприятностями. Стати каст успокоит компилятор как свидетельство того, что вы не боитесь.
Цитата Сообщение от Dimgo2 Посмотреть сообщение
в учебнике Стивена Прата "Язык программирования c++"довольно часто используется Си приведение.
Для указателей на классы в иерархии? У меня Пратта довольно свежий. Скажите главу и подраздел и покажите код.
Цитата Сообщение от Dimgo2 Посмотреть сообщение
Но есть же способ при использовании typeid
Есть, но технология та же. И в конце концов, вы же про приведения спрашиваете. Они водятся в тех же местах. Достаточно подойти тяжелой плите виртуальной таблицы в тёмное время и можно встретить одно или парочку.
0
19497 / 10102 / 2461
Регистрация: 30.01.2014
Сообщений: 17,808
18.11.2019, 21:21
Цитата Сообщение от Dimgo2 Посмотреть сообщение
Хм, странно, что в учебнике Стивена Прата "Язык программирования c++"довольно часто используется Си приведение. Если я правильно понимаю, static_cast в данном случае является самым быстрым приведением(не включая reinterpret_­cast и опасные методы, которые могут лопнуть в runtime при нормальных условиях)? Мне нужны минимальные потери(раньше было ошибочное мнение, что Си приведение легче чем static_cast, ведь это чистая Си )
Нет, неправильно понимаете. static_cast такой же быстрый, как и си-стайл каст если они используются в одинаковом контексте. Т.е., если мы говорим о приведении по иерархии, если static_cast`у нужно добавить смещение к указателю, чтобы привести к базовому классу при множественном наследовании, то и c-style cast это сделает тоже.
Отличия с-style каста, как уже говорилось, в множественной семантике в зависимости от контекста компиляции. Т.е. выбор того, какой именно вариант применить делает компилятор, а не делается перебор всех вариантов на этапе исполнения, как вы, возможно, подумали.

Добавлено через 1 минуту
Цитата Сообщение от IGPIGP Посмотреть сообщение
Для указателей на классы в иерархии?
А почему бы и нет?
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
18.11.2019, 21:26
Цитата Сообщение от DrOffset Посмотреть сообщение
А почему бы и нет?
Принцип минимализма говорит о применения static_cast, хотя при c-style cast компилятор сам выберет static_cast. Но я считаю, что применение неявных и сайдэффектных действий - охота на собственную мадам Си Жу. Я повидал у Пратты много чего, из того что нельзя списать на трудности перевода, но такого не припоминаю. Поэтому и попросил указать.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,910
19.11.2019, 09:56
Цитата Сообщение от Dimgo2 Посмотреть сообщение
Но есть же способ при использовании typeid
Через typeid не самый быстрый способ. Те же таблицы виртуальных функций лучше.
Но тоже не переоценивайте сложность: использование таблицы это всего лишь один лишний переход по указателю
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
19.11.2019, 10:36
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Через typeid не самый быстрый способ. Те же таблицы виртуальных функций лучше.
А откуда typeid в рантайме выберет инфу? Я лично, не знаю, но думаю, Пойдёт к таблице, наверное. И ему нужно строковые переменные возвращать (возможно тоже указатели), а вариантов при множественном наследовании много... а каст лишь возвращает указатель ноль или не ноль. Ему проще должно быть.
Остальные приведения живут во время компиляции, - на том свете то есть, и времени выполнения им не видать.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,910
19.11.2019, 11:16
Цитата Сообщение от IGPIGP Посмотреть сообщение
А откуда typeid в рантайме выберет инфу?
дело не в том откуда берет инфу, а как обрабатывает. А обрабатывает как раз в текстовом виде (возможно, не только, но я видел такое). Плюс сам по себе typeid нужен не так уж часто, то есть на основе полученной строки будут еще какие-то вычисления. Проще уж использовать для этого уже имеющийся механизм наследования.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
19.11.2019, 11:31
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А обрабатывает как раз в текстовом виде (возможно, не только, но я видел такое).
В рантайме он сначала дожен выяснить динамический тип (сделать по сути то, что делает приведение), а потом ещё морочиться со строками. Он должен быть чуть медленнее по идее. Это предположение, но интересно послушать, тех кто знает наверняка, хоть в какой-то реализации.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,910
19.11.2019, 12:13
Цитата Сообщение от IGPIGP Посмотреть сообщение
В рантайме он сначала дожен выяснить динамический тип (сделать по сути то, что делает приведение), а потом ещё морочиться со строками.
Не факт. Может просто хранить виртуальную функцию typeid в той же таблице, тогда весь typeid будет просто вызовом этой функции.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
19.11.2019, 13:30
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Не факт. Может просто хранить виртуальную функцию typeid в той же таблице, тогда весь typeid будет просто вызовом этой функции.
Вопрос реализации конечно, но с точки зрения лезвия Оккама, принципа DRY и пр. это не логично.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,910
19.11.2019, 14:35
Отчего ж не логично? С ходу я не могу придумать более простого и очевидного решения.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
19.11.2019, 14:39
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
С ходу я не могу придумать более простого и очевидного решения.
Решения чего? Мы же говорим о том, что быстрее - dynamic_cast или type_id ? Я говорю о том, что последнему нужно сделать больше работы, то есть то что и первый плюс в булочную сгонять. Поэтому он скорее всего не быстрее, а медленнее.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,910
19.11.2019, 15:55
Цитата Сообщение от IGPIGP Посмотреть сообщение
Решения чего?
реализации typeid, мы же про это говорим.
Цитата Сообщение от IGPIGP Посмотреть сообщение
что быстрее - dynamic_cast или type_id ?
Тут вообще потерял нить разговора. ТС хочет использовать виртуальные методы и опасается, что это будет медленнее, чем явное приведение типов через typeid. Это не так, поскольку виртуальный метод это всего один лишний переход по указателю, а для приведения типов надо сначала вызывать относительно медленную typeid, передать результат в условие и, наконец, явно привести типы. Сам по себе вызов typeid дороже виртуального метода, не говоря уж об остальном коде.
0
0 / 0 / 0
Регистрация: 11.11.2017
Сообщений: 50
20.11.2019, 15:17  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
Скажите главу и подраздел и покажите код.
Отвечу позже, когда будет свободное время(времени реально в обрез)
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
20.11.2019, 17:27
Цитата Сообщение от Dimgo2 Посмотреть сообщение
Отвечу позже, когда будет свободное время(времени реально в обрез)
У меня тем более.

Добавлено через 1 минуту
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Тут вообще потерял нить разговора.
И я об этом.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
20.11.2019, 17:27
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
А обрабатывает как раз в текстовом виде (возможно, не только, но я видел такое).
что за бред?

под капотом typeid и dynamic_cast - один и тот же механизм.
если что.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,910
21.11.2019, 09:54
Учимся читать русский текст:
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Может просто хранить виртуальную функцию typeid в той же таблице, тогда весь typeid будет просто вызовом этой функции.
Из цитаты видно, что рассуждения о механизме работы typeid меня никогда особо не интересовали, но было сделано предположение о механизме работы. Естественно, на результат эти подробности никак не влияют: штатный механизм виртуальных методов эффективнее ручного.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
21.11.2019, 11:07
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
было сделано предположение о механизме работы. Естественно, на результат эти подробности никак не влияют: штатный механизм виртуальных методов эффективнее ручного.
Приведение это не вызов виртуального метода. Если для того чтобы вызвать простой виртуальный метод, нужно сначала вызвать виртуальный метод скрытый в type_id, то механизм виртуальности как таковой сокрыт непробиваемой тайной. Даже приведения так прятаться не умеют.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,910
21.11.2019, 12:04
Цитата Сообщение от IGPIGP Посмотреть сообщение
Если для того чтобы вызвать простой виртуальный метод, нужно сначала вызвать виртуальный метод скрытый в type_id
оО зачем? Есть механизм наследования с виртуальными методами. Если мы хотим поддерживать что-то вроде typeid, можно завести виртуальный метод, возвращающий какой-то идентификатор - число, строку, адрес - не важно.
То есть не typeid использовать для виртуальных методов, как вы предлагаете, а наоборот, виртуальные методы для typeid.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
21.11.2019, 12:18
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
оО зачем? Есть механизм наследования с виртуальными методами. Если мы хотим поддерживать что-то вроде typeid, можно завести виртуальный метод, возвращающий какой-то идентификатор - число, строку, адрес - не важно.
То есть не typeid использовать для виртуальных методов, как вы предлагаете, а наоборот, виртуальные методы для typeid.
Затем, что для запуска виртуального метода задействуется механизм выяснения (конкретизации) динамического типа. Зачем решать задачу дважды? DRY=Don't Repeat Yourself. COKPOWEHEU, боюсь, по какой-то фундаментальной причине мы не можем тут друг друга понять. Читатель имеет обе точки зрения. Предлагаю остановиться.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.11.2019, 12:18
Помогаю со студенческими работами здесь

Приведение указателей в стиле си
Здравствуйте, это наверное самый дурацкий вопрос но что значит скобочки в c++ т.е вот например дан код: void* p = (int *)&amp;ip; и...

Неявное приведение указателей на классы
Всем привет! Обнаружилась вот такая нестыковочка: имеем интерфейсный класс IIn. И имеем класс-наследник ExtIn : public IIn далее...

Приведение типов умных указателей
Добрый день. Реализовал простенький умный указатель с подсчетом ссылок. template&lt;typename object_t&gt; class Ptr { ...

Отличие приведение типов указателей
Чем отличаются при Base* a_ptr = new Derivered(); следующие строки: A) auto ptr = static_cast&lt;Derived*&gt;( a_ptr ); B) auto ptr =...

Объяснить, что происходит в коде (приведение одного типа указателей к другому?)
char* a = &quot;Hell&quot;; int* b =(int*) a; cout &lt;&lt; *b; Как я понимаю в этом кусочке кода происходит преобразование одного типа...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
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, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru