0 / 0 / 0
Регистрация: 11.11.2017
Сообщений: 50
|
|
1 | |
Дорого ли приведение указателей?14.11.2019, 18:19. Показов 6096. Ответов 55
Я не встретил эту тему в инете(именно про указатели, а не просто типы), но если она есть, дайте ссылку. На сколько дорога операция приведения указателя в стиле СИ? К примеру, есть два класса, один наследует другой. Дорого ли приведение указателя из указателя на родительский класс на указатель на дочерний? Я знаю, что указатель—это обычный int, который система принимает за адрес в памяти. Переменная, содержащая в себе указатель на объект представляет из себя int со значением вида 0x7f84a41000c0. Тогда, по идее, это не дорого для процессора. Я прав?
0
|
14.11.2019, 18:19 | |
Ответы с готовыми решениями:
55
Приведение указателей Приведение указателей приведение типов указателей Приведение указателей в стиле си |
фрилансер
5497 / 5093 / 1047
Регистрация: 11.10.2019
Сообщений: 13,338
|
|
21.11.2019, 12:21 | 41 |
COKPOWEHEU, IGPIGP, зачем спорить. Можно же просто провести нагрузочный тест для обоих вариантов. И проверить, сколько времени займёт миллион таких вызовов
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
21.11.2019, 12:32 | 42 |
На самом деле нет ни одной реализации, где было бы так, как вы описываете.
Виртуальность никогда не реализовывалась через RTTI и сама по себе виртуальность появилась исторически гораздо раньше, чем RTTI (разница в почти 13 лет).
2
|
Комп_Оратор)
|
|
21.11.2019, 12:36 | 43 |
Ok, - на каждом компиляторе, на каждой версии. Вопрос же топика о скорости приведений.
Можно попробовать. Но если не заставлять строки использовать придётся сравнивать два type_id? А указатель нужно лишь на на проверить. Вечером может поковыряю. А вам, как инициатору, предлагаю положить свою версию теста. Добавлено через 3 минуты Сейчас подумал и понял, что увлёкся. То есть, вы полагаете, type_id и dynamic_cast реализованы по разному и type_id может быть быстрее? Спор об этом возник.
0
|
фрилансер
5497 / 5093 / 1047
Регистрация: 11.10.2019
Сообщений: 13,338
|
|
21.11.2019, 12:44 | 44 |
IGPIGP, я не знаю точно, как именно организовать тест, чтобы всякие там кеши процессора не повлияли. Вызовы в цикле без всяких заморочек подойдут? Или лучше пересоздавать объект на каждой итерации?
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
21.11.2019, 13:00 | 45 |
Нет, я такого не говорил.
Во-первых я хотел бы сказать, что не любой typeid, также как и не любой dynamic_cast обязаны разрешаться на этапе исполнения. Если у компилятора есть вся необходимая информация, то runtime структуры с динамической информацией о типе даже не задействуются. Во-вторых в общем смысле type_id и dynamic_cast - это части RTTI. И тот и другой при условии динамического исполнения черпают информацию из одного источника - специальной структуры данных c динамической информацией о типе. Вот ссылка на то, как это делается в Itanium ABI (в Windows ABI примерно так же): https://itanium-cxx-abi.github... .html#rtti Оттуда: Как сравниваются два typeid: https://itanium-cxx-abi.github... -algorithm Т.е. никакого сравнения строк нет, и нет даже поиска по хеш-таблице, как в более ранних реализациях.
2
|
фрилансер
5497 / 5093 / 1047
Регистрация: 11.10.2019
Сообщений: 13,338
|
||||||
21.11.2019, 13:20 | 46 | |||||
в общем, насчёт корректности теста не уверен, критикуйте
iters: 10000000 dynamic_cast: 1288 ms typeid : 1168 ms
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
21.11.2019, 13:36 | 47 |
Алексей1153, во-первых участие в замере динамической аллокации сводит на нет всю достоверность.
А что вы хотели этим тестом показать? Можете словами сформулировать?
0
|
фрилансер
5497 / 5093 / 1047
Регистрация: 11.10.2019
Сообщений: 13,338
|
|
21.11.2019, 13:41 | 48 |
DrOffset, лично я - ничего не собирался показывать https://www.cyberforum.ru/post14016822.html
Но разница между двумя интервалами показывает, что выполняется быстрее, поскольку всё остальное в циклах одинаковое.
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|||||||||||
21.11.2019, 13:52 | 49 | ||||||||||
Ну как же, вы предложили разрешить спор через замер. Значит вы знаете что нужно замерить, чтобы склонить чашу весов в ту или иную сторону. Вот я и спросил, что именно вы меряете?
Это не так. У вас там аллокации. Которые никто не обязывал отрабатывать за одинаковое время. И замеряете вы в дебаге, а там могут быть всякие проверки, которые замедляют выполнение. Это безотносительно сути замера. Но это даже не важно здесь. Важнее понять что именно мы меряем. Вот у нас есть typeid. Что это? Это получение указателя на type_info из VTBL. Код с typeid условно такой:
Код с dynamic_cast условно такой:
1
|
3881 / 2479 / 418
Регистрация: 09.09.2017
Сообщений: 10,879
|
||||||
21.11.2019, 14:05 | 50 | |||||
Для работы механизма таблицы виртуальных функций нет нужды в знании типа. Меня самого заинтересовала эта задача, так что набросал демонстрационный код (АХТУНГ! код кишит неопределенным поведением и старательно использует внутренности g++. Он может вызвать сегфолт, поломать чужую память и погрызть тапки!)
Код
$ g++ main.c $ ./a.out Sample: cCl cCl(2, 1) 4 Virt : cChild cChild(2, 1) 3 Child : cChild cChild(2, 1) 3 Hacked: cCl cCl(2, 1) 5 Собственно, именно отсюда берется "лишний переход по указателю", о котором я говорил с самого начала.
1
|
фрилансер
5497 / 5093 / 1047
Регистрация: 11.10.2019
Сообщений: 13,338
|
|
21.11.2019, 14:12 | 51 |
DrOffset, про корректность теста я выше сразу написал - что я не уверен в ней.
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
21.11.2019, 14:14 | 52 |
Ну вот я вам показал, надеюсь, в чем именно проблема.
Просто сначала я хотел чтобы вы сами к этому пришли. Если бы вы начали формулировать словами достаточно строго смысл ваших замеров, то сами столкнулись бы с противоречием.
0
|
фрилансер
5497 / 5093 / 1047
Регистрация: 11.10.2019
Сообщений: 13,338
|
||||||
21.11.2019, 14:26 | 53 | |||||
DrOffset, ну так в итоге то что, получается, нужно оставить циклы вот в таком виде и запускать в релизе?
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
21.11.2019, 15:54 | 54 |
Нет. Это же разные действия.
Сравнивать имеет смысл только эквивалентные по результату действия. Например два алгоритма сортировки. Результат одинаковый, процессы разные. Вот можно их сравнить. А тут? Добавлено через 3 минуты Ну хорошо, допустим мы сравнили, избавились от излишней оптимизации, оставили нужную - получили результат. Как это докажет или опровергнет позицию одной из сторон? Не по теме: В вашей текущей реализации просто исходя из количества действий первый цикл всегда будет медленнее, чем второй. Можно даже не мерить ничего. Но что это значит в контексте спора? Мне вот ответ на этот вопрос не очевиден совсем.
0
|
фрилансер
5497 / 5093 / 1047
Регистрация: 11.10.2019
Сообщений: 13,338
|
|
21.11.2019, 16:07 | 55 |
DrOffset, в общем, понятно, работает вечное правило оптимизации - сначала нужно доказать, что оптимизация нужна, только потом начинать замерять и оптимизировать
0
|
Вездепух
11694 / 6373 / 1723
Регистрация: 18.10.2014
Сообщений: 16,057
|
|
22.11.2019, 00:02 | 56 |
Преобразование указателей в стиле С в языке С++ - слишком универсальная операция. Она может быть
1. Чисто концептуальной: не порождать кода вообще, т.е. быть бесплатной 2. Производить сдвиг указателя на значение времени компиляции. Так как язык требует, чтобы null-указатель превращался именно null-указатель, такой сдвиг должен еще сопровождаться проверкой на null. Это уже дороже, но все равно относительно дешево. 3. Производить модификацию значения указателя на значение времени выполнения. Такое возможно при преобразованиях указателей на члены класса (хотя они формально не являются "указателями"). 4. Выполнять относительно "тяжелые" обращения к структурам в памяти, например, при преобразовании указателей в иерархии с виртуальным наследованием. Опять же, оговорка про null имеет место и здесь. Так что все зависит от контекста.
0
|
22.11.2019, 00:02 | |
22.11.2019, 00:02 | |
Помогаю со студенческими работами здесь
56
Неявное приведение указателей на классы Приведение типов умных указателей Отличие приведение типов указателей Объяснить, что происходит в коде (приведение одного типа указателей к другому?) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |