108 / 108 / 23
Регистрация: 21.03.2010
Сообщений: 445
|
|||||||||||
1 | |||||||||||
Сложение указателей01.05.2012, 18:01. Показов 4255. Ответов 16
Метки нет (Все метки)
Чисто декларативно замечу что это не безсмысленная операция, как нам о том повествуют всюду.
пример:
0
|
01.05.2012, 18:01 | |
Ответы с готовыми решениями:
16
Сложение двух указателей сложение 2 указателей в функции Почему в сортировке указателей на объекты в вызове функции используются адреса объектов, а не указателей? Объяснить различия в работе указателей на целое число и указателей на const char (строки в стиле Си) |
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
01.05.2012, 18:05 | 2 |
CEBEP, стандарт с вами не согласится
0
|
108 / 108 / 23
Регистрация: 21.03.2010
Сообщений: 445
|
|
01.05.2012, 18:21 [ТС] | 3 |
В чём конкретно он со мной не согласится? То что эти указатели не объедены массивом это весомый момент, но, думаю, степень гипотетичности всего выражения в целом позволяет закрыть на это глаза, ведь сложение указателей должно будет вернуть указатель который вовсе не обязан иметь смысл как таковой, а лишь должен быть использован как левый аргумент в операции вычитания.
Да и вообще что толку апеллировать к стандарту, если зашла речь о сущности которую он предал анафеме? Я просто хотел заметить что чисто алгебраически такая операция может иметь смысл.
0
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
01.05.2012, 18:24 | 4 |
разность указателей дает тип ptrdiff_t
то что нельзя просто так орудовать с указателями говорит стандарт и эта тема [Задача] Адресная арифметика
1
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
01.05.2012, 18:28 | 5 |
может быть и можно было бы второй вариант использовать, но для чего?
для обфускации, чтобы враги дольше код понимали?
0
|
108 / 108 / 23
Регистрация: 21.03.2010
Сообщений: 445
|
|
01.05.2012, 18:45 [ТС] | 6 |
0
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
01.05.2012, 18:50 | 7 |
копеечная оптимизация, да и то не факт. нужно в асм смотреть после компиляции с оптимизацией или замеры делать. в любом случае на производительность программы в целом это врятли повлияет. зато код стал такой хитромудрый, что не каждый его сможет осознать.
0
|
бжни
2473 / 1684 / 135
Регистрация: 14.05.2009
Сообщений: 7,162
|
|
01.05.2012, 18:54 | 8 |
по угару
если rightInsert и leftInsert у верхней границы адресов, то rightInsert + leftInsert может дать переполнение (на 32битах) и результатом будет невалидный указатель
0
|
108 / 108 / 23
Регистрация: 21.03.2010
Сообщений: 445
|
|
01.05.2012, 18:55 [ТС] | 9 |
Не понимаю попытки доказать что это бессмысленно. Строго говоря, я обратного и не утверждал
да, я об этом прямо упоминал во втором своём сообщении...
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|||||||||||
01.05.2012, 19:09 | 10 | ||||||||||
Добавлено через 1 минуту Или даже так (хотя мне предыдущий больше по душе)
0
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
||||||
01.05.2012, 19:15 | 11 | |||||
вы ассемблерный код то хотябы видели?
у вас там две арифметические операции с указателями. значит будет один промежуточный результат, его нужно в регистрах хранить что-то делать с этим всем. + не забыть учесть, что в арифметике указателей еще неявно учавствует размер. т.е. возможно там еще и умножение в каждой операции будет Вот какой ассемблер у меня получился в дебаге:
Если вы специалист - считайте такты. Кстати, ваш код даже не компилируется в студии.
2
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
||||||
01.05.2012, 19:26 | 12 | |||||
Ну он и не говорил, что компилируется. Это были размышления на тему "Ах если бы, ах если бы... Не жизнь была, а песня бы..."
Добавлено через 6 минут Кстати, даже если допустить правильность и полезность подобной конструкции, то сложение указателей всё-равно не нужно.
1
|
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
|
||||||
01.05.2012, 19:26 | 13 | |||||
Ну можно тогда вообще так
0
|
108 / 108 / 23
Регистрация: 21.03.2010
Сообщений: 445
|
|
01.05.2012, 19:35 [ТС] | 14 |
Второй вариант кода я и не пытался компилировать потому что был уверен что он не должен был компилироваться. То что у вас есть компилятор который это проглотил меня удивило.
ну в том варианте в котором вы предложили есть ссылка на
0
|
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
|
|||||||||||||||||||||
01.05.2012, 20:04 | 15 | ||||||||||||||||||||
Нет у него такого компилятора. Там просто целые складываются.
Разумеется. Но это-то, кстати, можно предусмотреть, выделяя элементы из одного массива Но Баба-Яга всё-равно против Добавлено через 25 минут Ну и чтобы показать, насколько программист может усложнить "жизнь" компилятору, посмотрим, что делает GCC4.5 в режиме оптимизации -O3 Скомпилированы следующие 3 функции:
Из второй вышло такое:
Третий код оказался идентичным первому.
Выбирайте DU, у тебя в третьей функции ошибка. По условию выполняется то же, что и без условия.
1
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
01.05.2012, 20:15 | 16 |
ну да, есть такое. оптимизатор мог бы вообще удалить проверки буля и всего того, что в ифе написано. код стал бы мегаоптимальным .
Возвращаясь к предпосылкам возникновения темы: нехер писать подобного рода оптимизации, даже если они реально более оптимальны. выйгрыш копеечный. главное чтобы код оставался чистым, понимаемым, сопровождаемым. а то ведь если все писать в таком духе, где черт ногу словит, но зато "оптимально" одно случайное преобразование типа (скажем из конст чара в строку) из-за динамического выделения памяти в тыщу раз перекроет все эти потуги ради пары тактов. Впрочем, до понимания этих вещей нужно еще дорасти. Просто советы не работают. На себе проверено
0
|
108 / 108 / 23
Регистрация: 21.03.2010
Сообщений: 445
|
|
01.05.2012, 20:15 [ТС] | 17 |
Всё таки зря я попытался искать в этой операции практическую суть. И тем не менее, ведь такое поведение связанно как раз с тем, что как такового сложения указателей не происходит.
0
|
01.05.2012, 20:15 | |
01.05.2012, 20:15 | |
Помогаю со студенческими работами здесь
17
Создать специфицированный шаблон функции, принимающей массив указателей на char и количество самих указателей Создать специализацию для шаблона, которая принимает массив указателей на строки и количество этих указателей Различия указателей char* от указателей других типов Как обойтись без указателей и указателей на указатель? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |