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

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

14.11.2019, 18:19. Показов 7443. Ответов 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
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
14.11.2019, 18:28
Dimgo2, прав Все эти типы переменных, указатели на разные типы важны для компилятора.
Чтобы сформировать правильный код и не допустить синтаксических ошибок программиста.
1
0 / 0 / 0
Регистрация: 11.11.2017
Сообщений: 50
14.11.2019, 18:34  [ТС]
Тяжело ли приведение типов в стиле Си? Есть ли что-то легче для процессора?
0
Эксперт CЭксперт С++
 Аватар для liv
5120 / 4574 / 855
Регистрация: 07.10.2015
Сообщений: 9,462
14.11.2019, 18:41
Лучший ответ Сообщение было отмечено Dimgo2 как решение

Решение

Dimgo2, а процессору-то какая разница? Отработает все, что ему "подсунут"
В чем сомнения-то? Это программисту должно быть тяжело, если приходится приводить типы.
Приведение - это же не какие-то преобразования, а просто указание компилятору считать данные или адрес на данные
чем-то другим. Код не увеличивается ни на команду! Разве что, например, байт увеличивается до двойного слова или наоборот.
Если одного размера, так вообще ничего не меняется.
1
0 / 0 / 0
Регистрация: 11.11.2017
Сообщений: 50
14.11.2019, 18:47  [ТС]
Проблема в том, что создаю сложную иерархию классов. Вкратце, нужно создать два класса, которые должны быть "одним типом".
Или создаю один класс(class Num), от которого наследуются другие(Unknown, Integer), или создаю структуру Num с указателями на Unknown и Integer. Проблема в том, что в случаи наследования, приходится часто приводить указатели для того, чтобы получить члены класса, а в случае со структурой код становится грязным.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
14.11.2019, 20:46
Цитата Сообщение от Dimgo2 Посмотреть сообщение
Дорого ли приведение указателя из указателя на родительский класс на указатель на дочерний?
Dimgo2, это не делается в силе С (reinterpret_cast<>). Тут применяют static_cast<> или dynamic_cast<> в зависимости от того, какая стоит задача. Дело в том, что указатель базового может показывать на наследника и если нужна вся его функциональность то лучше динамически кастить и проверять успех. Но бывыают случаи когда нужно кастить статически и обращаться к известным базовому методам без проверок. Тогда static_cast<>.

Добавлено через 8 минут
Цитата Сообщение от Dimgo2 Посмотреть сообщение
На сколько дорога операция приведения указателя в стиле СИ?
Простые приведения безвредны. Они летают и стонут , но это понты (имхо). Всё делается во время компиляции (кроме полиморфных приведений, но о них уже сказано).
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
14.11.2019, 21:03
Цитата Сообщение от IGPIGP Посмотреть сообщение
в силе С (reinterpret_cast<>)
Приведение в стиле Си является reinterpret_cast в последнюю очередь.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
14.11.2019, 21:34
Цитата Сообщение от DrOffset Посмотреть сообщение
Приведение в стиле Си является reinterpret_cast в последнюю очередь.
Я не силён в тонкостях. И речь была не о таких тонкостях. Исходя из вопроса. DrOffset, ваше односложное
Цитата Сообщение от DrOffset Посмотреть сообщение
в последнюю очередь.
смущает. Я бесспорно признаю ваш приоритет, но никогда (или по крайней мере стараюсь) не ставлю целью меряться толщиной учебника. Могу например навскидку:
Цитата Сообщение от Язык программирования С++. 4-е, специальная ред. 2002 Б.Страуструп
стр.171
6.2.7. Явное преобразование типов
стр.172
последний абзац
С++ унаследовал от С форму записи (T)e, означающую любое преобразование, которое может быть выражено комбинацией static_cast, reinterpret_cast и constant_cast, для получения типа T из выражения e...
Я согласен, что reinterpret_cast это лишь часть зла. Но в контексте вопроса я не увидел это существенным. А писать целые странцы лишь чтобы не нарваться на чьё то замечание... Может и надо. Иначе потом придётся.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
14.11.2019, 22:46
Цитата Сообщение от IGPIGP Посмотреть сообщение
А писать целые странцы лишь чтобы не нарваться на чьё то замечание...
Вы слишком драматизируете. Мое замечание было не для вас, а для ТС. Который грешным делом мог подумать, что каст в Си стиле равен reinterpret_cast безусловно.

Добавлено через 5 минут
На самом же деле, он может являться и static_cast и const_cast и их комбинацией, в зависимости от контекста использования. reinterpret_cast он будет являться только если ничего из вышеперечисленного применить не удалось.
В учебнике, который вы цитируете, скорее всего не совсем корректный перевод. Вот вам первоисточник:
http://eel.is/c++draft/expr.compound#expr.cast-4
The conversions performed by
(4.1)
a const_­cast,
(4.2)
a static_­cast,
(4.3)
a static_­cast followed by a const_­cast,
(4.4)
a reinterpret_­cast, or
(4.5)
a reinterpret_­cast followed by a const_­cast,
Как видите, reinterpret_­cast рассматривается в последнюю очередь, о чем я и сказал.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
15.11.2019, 00:03
Цитата Сообщение от DrOffset Посмотреть сообщение
Вы слишком драматизируете. Мое замечание было не для вас, а для ТС. Который грешным делом мог подумать, что каст в Си стиле равен reinterpret_cast безусловно.
Ничуть. У меня нигде не сказано что это одно и то же самое. Это может быть эквивалентно. Но односложность реплики смутила, повторяю.
Цитата Сообщение от DrOffset Посмотреть сообщение
Как видите, reinterpret_­cast рассматривается в последнюю очередь, о чем я и сказал.
Форма высказывания и важность уточнения не вызывают сомнения. У меня более старое издание, я думаю. Вот совсем не старый Липман Язык программирования С++. Базовый курс. (2018 Москва, СПб, Киев) Глава 4.11.3 Явные преобразования, подраздел Приведение типов в старом стиле стр 225.
В зависимости от используемых типов, приведение старого стиля срабатывает аналогично операторам const_­cast, static_­cast ИЛИ reinterpret_­cast. В случаях, где используются операторы static_­cast или const_­cast, преобразование типа позволяет осуществить аналогичное преобразование, что и соответствующий оператор приведения. Но если ни один из подходов недопустим, то приведение старого стиля срабатывает аналогично оператору reinterpret_cast. Например, используя старую форму записи старого стиля, можно получить тот же результат, что и с использованием reinterpret_cast.
Далее пример с приведением указателя int* в указатель char*. То есть, речь идёт о приоритете выбора преобразования где самым жестким и мощным (включающим все попытки при получении неудачи в подборе более легальных правил преобразования соответствующим предыдущим операторам) является reinterpret_cast. То есть, говоря кратко, его упоминание в скобках наиболее краткая форма того что я и хотел сказать. Если бы я стал упоминать все по порядку, то и пришлось бы переписать главу из любой перечисленной книжки. Это небольшие главы - по 1-2 страницы.
То есть, раздел - минное поле. Скажешь слова - жди беды.
А между тем, приведение типов при наследовании, - даже одиночном, - достаточно непростая тема. И это то что возможно интересует ТС. Но тут уж я бы отвечал, на конкретные вопросы, конечно. Стоимость преобразования указателей при наследовании, достаточно обширно выглядит.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,921
15.11.2019, 12:07
Цитата Сообщение от Dimgo2 Посмотреть сообщение
Я знаю, что указатель—это обычный int
воу-воу-воу! Это не так. Указатель это целочисленный тип, да. Но не конкретно int. Более того, в некоторых случаях даже на одной машине разные указатели могут быть разного размера.
Цитата Сообщение от Dimgo2 Посмотреть сообщение
К примеру, есть два класса, один наследует другой. Дорого ли приведение указателя из указателя на родительский класс на указатель на дочерний?
Тут дело скорее не в указателе (как вы сами сказали, это просто число), а в наследовании классов. Если у класса есть виртуальные методы, то есть те, которые перекрываются методами потомка, в классе используется виртуальная таблица методов (вот тут в терминоголии могу наврать, надеюсь меня поправят), и вызов метода пройдет в два этапа: переход на таблицу, а потом из нее на реальный метод. И вот здесь уже может быть потеря производительности. Плюс при наследовании может быть нужно определить реальный тип потомка из родительского указателя, это тоже не решается на этапе компиляции, а значит отнимет какое-то время.
То есть само по себе приведение указателей бесплатное. Но вот доступ к объекту по указателю может оказаться чуть дороже, чем ожидалось.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
15.11.2019, 12:21
Цитата Сообщение от Dimgo2 Посмотреть сообщение
Я знаю, что указатель—это обычный int, который система принимает за адрес в памяти
COKPOWEHEU, ТС неточно выразился в надежде на понимание. Если под
Цитата Сообщение от Dimgo2 Посмотреть сообщение
обычный int, который система принимает за адрес в памяти
понимать как целое (без знак наверное) то понятно о чём он говорит. Но в основном я с вами согласен. Размер может отличаться не толька в зависимости от платформы. Насколько я помню стандарт не гарантирует равенства размера указателя на void размеру указателя на int (и др.). Но это не влияет на вопросы связанные с полиморфным наследованием. Не вникая в тонкости реализации можно полагаться на общее мнение о том, что RTTI дорогая процедура, а dynamic_cast<> - один из способов выяснения по RTTI.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,921
15.11.2019, 13:29
Цитата Сообщение от IGPIGP Посмотреть сообщение
ТС неточно выразился в надежде на понимание.
Я-то понял что ТС имел в виду, но за такой его формулировкой может стоять пробел в понимании, именно поэтому я расписал про представление указателей более подробно.
Цитата Сообщение от IGPIGP Посмотреть сообщение
Не вникая в тонкости реализации можно полагаться на общее мнение о том, что RTTI
Ну да, сам термин RTTI это "не вникая в тонкости"
1
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
15.11.2019, 14:45
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Указатель это целочисленный тип, да.
???
Цитата Сообщение от https://timsong-cpp.github.io/cppwp/n4659/basic.fundamental#7
Types bool, char, char16_­t, char32_­t, wchar_­t, and the signed and unsigned integer types are collectively called integral types. A synonym for integral type is integer type.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,921
15.11.2019, 18:28
rat0r, а в чем вопрос-то? Указатель это целое число, хранящее номер ячейки памяти. Размер указателя может быть в общем случае любым (ближе всего будет size_t пожалуй).
integer type != int
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
15.11.2019, 19:09
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
а в чем вопрос-то?
Откуда ты берёшь то, что вещаешь.
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
Указатель это целое число, хранящее номер ячейки памяти.
Цитату можно?
Цитата Сообщение от COKPOWEHEU Посмотреть сообщение
integer type != int
Гениально!!! Об этом и написано в https://timsong-cpp.github.io/... damental#7
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,921
15.11.2019, 19:42
Цитата Сообщение от rat0r Посмотреть сообщение
Откуда ты берёшь то, что вещаешь.
Если без ссылок, то из опыта или общих соображений, причем зачастую адаптирую под новичков.
Правда, все еще непонятно что же именно вас не устраивает. Комментария "???" для этого явно недостаточно. Разверните свою мысль.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
15.11.2019, 22:06
rat0r, в контексте обсуждения с ТС было сказано на понятном ему языке. Тут вы уже второй участник с большим опытом нашедший "ошибку". А тема просится в новичковский раздел прямо со стартового текста. И первое уточнение (с выбором преобразования от С-style cast к реально выполняемому компилятором) вынесет любому новичку мозг выбросив далеко от темы. Что касается целочисленного типа, то да, неудачное словосочетания, но оно наиболее кратко соответствует вопросу:
Цитата Сообщение от Dimgo2 Посмотреть сообщение
Я знаю, что указатель—это обычный int, который система принимает за адрес в памяти.
Ни кто разумеется не думает о integral types, отвечая на этот текст. Но мера условности соответствует уровню спрашивающего. И устанавливает её отвечающий. Почему бы вам не дать свой вариант ответа (и сравнить его потом с тем что уже есть, учитывая уровень ТС). Я не с сарказмом предлагаю. Пусть будут разные варианты ответов.
А пока, имеем:
Цитата Сообщение от IGPIGP Посмотреть сообщение
То есть, раздел - минное поле. Скажешь слово, - жди беды.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
17.11.2019, 21:47
Цитата Сообщение от IGPIGP Посмотреть сообщение
То есть, раздел - минное поле. Скажешь слова - жди беды.
...
Миниатюры
Дорого ли приведение указателей?  
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
17.11.2019, 23:07
rat0r, это типичная история о том, как плохо быть бестолковым. Причём, зная наших врачей, не очевидно, - кто в данной ситуации есть кто из действующих по фотографии лиц. Но вероятность, что тот кто пытается лечить очень высока. Даже в случае, когда клиент приходит к доктору добровольно становясь пациентом. Когда же доктор (или самозванец) сам проявляет инициативу, идя к клиенту наугад, то важно просто правильно выбрать меру допустимой самообороны.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.11.2019, 23:07
Помогаю со студенческими работами здесь

Приведение указателей в стиле си
Здравствуйте, это наверное самый дурацкий вопрос но что значит скобочки в 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; Как я понимаю в этом кусочке кода происходит преобразование одного типа...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru