|
8 / 8 / 0
Регистрация: 17.04.2010
Сообщений: 112
|
|||||||||||
Разница между префиксной и постфиксной формой записи счетчика цикла26.04.2010, 17:56. Показов 32686. Ответов 57
Метки нет (Все метки)
Здравствуйте!
Когда оформлял циклы всегда использовал такую запись:
В последнее время стал встречать другую запись:
Когда какой более предпочтителен?
0
|
|||||||||||
| 26.04.2010, 17:56 | |
|
Ответы с готовыми решениями:
57
Перегрузка постфиксной и префиксной операции инкремента Перегрузка постфиксной и префиксной формы оператора ++ Отличие постфиксной и префиксной формы декрементирования при работе с массивами |
|
Вездепух
12922 / 6789 / 1818
Регистрация: 18.10.2014
Сообщений: 17,179
|
||
| 25.02.2016, 04:32 | ||
|
Оптимизации такого рода весьма и весьма нетривиальны, в том смысле, что для не-inline вызова функций идеального способа выполнения такой оптимизации просто не существует: надо либо делать ветвление внутри реализации оператора, либо генерировать несколько версий оператора. Все варианты обладают своими достоинствами и недостатками.
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||
| 25.02.2016, 05:03 | ||||||||
|
компиляторы уже давно научились стандартным RVO/NRVO оптимизациям. и в ситуации, когда они фиксят, что снаружи значение никому не нужно, они запросто могут выпилить конструктор их обязаны уметь все компиляторы. и они их умеют уже с незапамятных времен. все очень просто: стандарт разрешает компиляторам покласть болт на любые возможные эффекты в конструкторах копий. а это значит, что компилятору вообще фиолетовы любые побочные эффекты внутри функции. ему достаточно знать её прототип, что бы при необходимости выпилить конструктор копии в каких то опр. случаях. например, когда значение снаружи все равно никому не нужно. я хочу сказать, что совершенно не важно насколько нетривиальна функция. компилятор оптимизирует конструкцию вида:
как и для обычного инта.
0
|
||||||||
|
Вездепух
12922 / 6789 / 1818
Регистрация: 18.10.2014
Сообщений: 17,179
|
||||||||
| 25.02.2016, 05:40 | ||||||||
|
Термины RVO и NRVO в своем каноническом значении относятся именно и только к ситуациям, когда возвращаемое значение именно нужно вызывающему коду. RVO и NRVO описывают стуации, когда внутреннему коду функции разрешается исключать формирование промежуточных локальные объектов (именованных или не именованных), и взамен формировать результат напрямую в объекте-приемнике, предоставленном вызывающим кодом. Ситуации, когда результат вызова функции вообще никому не нужен, непосредственно к RVO и NRVO не относятся. Но если вам нравится включать в RVO и NRVO и такие ситуации - пожалуйста, включайте, никто вам не запретит. Термины RVO и NRVO, как никак, [полу-]неформальны. Тем не менее это ничего не меняет. Реализация оптимизаций для случая игнорируемого значения все равно требует, как я сказал выше, либо run-time branching, либо генерации нескольких версий оператора, либо еще чего-то в этом роде. Ни один из этих вариантов не является "бесплатным". Правильнее будет сказать: разрешены стандартом. Но это никоим образом ничего не меняет. К чему это здесь?Но в общем случае ваше утверждение неверно. В общем случае игнорировать конструкторы именованных копий компилятору не разрешается. Собственно по этой причине мы и наблюдаем развития языка в сторону NRVO, move semantics и т.п. Эти свойства языка появились именно из-за мешающих оптимизациям принципиальных различий в семантике встроенных и пользовательских типов.
2
|
||||||||
|
694 / 304 / 99
Регистрация: 04.07.2014
Сообщений: 851
|
|||||||||||
| 25.02.2016, 09:08 | |||||||||||
|
Рассматривать стоит, например, такой код:
++i для данного итератора делает тоже но быстрее и заменит на него (а если ещё это inline, то оптимизирует ещё лучше). Но если он ничего не знает об итераторе, то выставит то, что уже есть. А теперь посмотрим на стандартный пример реализации инкремента:
{++i;} и {i++;}.
0
|
|||||||||||
|
Вездепух
12922 / 6789 / 1818
Регистрация: 18.10.2014
Сообщений: 17,179
|
|||||||
| 25.02.2016, 09:50 | |||||||
|
Возможности для оптимизации тут кроются в другом. Например, при компиляции вашего постфиксного оператора '++' компилятор может заранее подумать о том, что в некоторых контекстах этот оператор может вызываться с игнорированием результата (вариант A), а в некоторых - с неигнорированием результата (вариант B). По этой причине компилятор может использовать ваше определение постфиксного оператора '++' для того, чтобы втихаря сгенерировать две версии скомпилированного кода: для вариантов A и B отдельно. Внутренние имена для этих двух реализаций будут разные, сгенерированные в соответствии с неким соглашением. Для варианта B оператор будет странслирован честно, как вы написали - с формированием возвращаемого значения. А вот для варианта A будет странслирована "урезанная" версия без возвращаемого значения, которая элементарно соптимизируется до
Вот об этой оптимизации и идет речь. Так, например, работает GCC. Понятно, что за такую оптимизацию приходится платить увеличением размера кода, ибо потенциально каждая функция с не-'void' типом возвращаемого значения может генерироваться в двух вариантах.
0
|
|||||||
|
694 / 304 / 99
Регистрация: 04.07.2014
Сообщений: 851
|
|
| 25.02.2016, 10:12 | |
|
TheCalligrapher, Это он может сделать, только если видит код, если код скомпилирован в другой объектный файл, то увы, стандартного соглашения об именовании такого урезанного варианта нет.
0
|
|
|
Вездепух
12922 / 6789 / 1818
Регистрация: 18.10.2014
Сообщений: 17,179
|
||
| 25.02.2016, 10:21 | ||
|
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||||||||||
| 25.02.2016, 10:23 | ||||||||||||||||||||
|
технология, которая позволяет компилятору удалять код запусков конструкторов. это трудности компилятора, как именно он будет выкручиваться. никаких пенальти в рантайме не будет. на то оно и оптимизация. они описаны стандартом. стандарт четко говорит: как , когда, и что должно быть.
затем допетрит, что obj1 так же образовалось, как не используемое. далее он засунет свои шаловливые ручонки в конструктор obj1. если не дотянеццо - оставит, как есть. если дотянеццо - будет искать сайд эффекты. если их нет - obj1 канет в лету. попробуйте искусственно смоделировать: написать код вызова функции. и обозначить два кейса: где возвращаемое значение используется, а значит его нельзя выпиливать. и где не используется, а значит нужно. для наглядности выполните ручную оптимизацию, развернув вашу функцию inline. и вы получите две разные ветки кода. причем в отдельных случаях одну ветку можно реализовать через другую. но это будут две разные нити исполнения. это - единственный способ обеспечить подобную оптимизацию вы можете считать это "платой" за оптимизацию, и полагать это, о боже! "code bloat". только с таким же успехом можно вообще технологию inline так обозвать "code bloat". а здравый смысл подсказывает: inline, манипуляции с абстрактным синтаксическим деревом, все это для того и было создано, что бы избежать пенальти в рантайме, за счет статики. тем, кого парит размер исходного кода и его быстродействие, не пишут всякий бред под капотом единицы трансляции. классическая схема:
1
|
||||||||||||||||||||
|
Вездепух
12922 / 6789 / 1818
Регистрация: 18.10.2014
Сообщений: 17,179
|
|||||||
| 25.02.2016, 10:38 | |||||||
|
1
|
|||||||
|
694 / 304 / 99
Регистрация: 04.07.2014
Сообщений: 851
|
||
| 25.02.2016, 10:51 | ||
_ZN6NumberppEi.Добавлено через 1 минуту Т.е. выделить место для временного объекта, его получить и разрушить
0
|
||
|
Вездепух
12922 / 6789 / 1818
Регистрация: 18.10.2014
Сообщений: 17,179
|
||
| 25.02.2016, 10:58 | ||
|
0
|
||
|
694 / 304 / 99
Регистрация: 04.07.2014
Сообщений: 851
|
|||||||||||||||||||||
| 25.02.2016, 11:35 | |||||||||||||||||||||
|
TheCalligrapher, Посмотри на результат, я там ничего не вижу кроме
_ZN6NumberppEi в объектом файле и его вызове в итоговом.Добавлено через 18 минут for.h:
0
|
|||||||||||||||||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||
| 25.02.2016, 19:07 | ||||||
|
вы никогда не задумывались, почему их называют "стандартными? http://en.cppreference.com/w/c... py_elision священного писания нет под рукой. однако, вы можете сами проверить и убедиться: они там описаны.
либо пенальти в рантайме, либо разбухание кода. ну так вот, оптимизация конструкторов устраняет пенальти в рантайме. а что касается разбухания кода - с тем же успехом, можно сказать, что у inline есть своя цена - о боже! inline подстановка приводит к увеличению объемов кода! то окажется, что для случаев, когда результат можно отбросить, компилятор оптимизировал простфикс до префикса. определенные в теле класса методы являются inline компилятору доступен контекст. он оптимизирует ненужный временный объект, в результате остается только префикс. то есть, тут даже никакого разбухания кода не происходит. никому не нужного объекта.
0
|
||||||
|
Вездепух
12922 / 6789 / 1818
Регистрация: 18.10.2014
Сообщений: 17,179
|
|||||
| 25.02.2016, 20:05 | |||||
|
Вы нам тут обширно разглагольствовали на тему того, что станадарт обязывает компиляторы делать такие оптимизации и даже говорит где и когда они обязаны это делать. Поэтому не надо нам тут мозги пудрить томными упоминаниями каких-то названий и описаний, а давайте-ка покажите нам, где это конкретно стандарт обязывает компиляторы выполнять оптимизации. Прямые цитаты из стандарта приведите, пжлст. Вопрос, конечно, риторический. Ничего подобного, разумеется, в стандарте нет. На этой замечательной ноте я закрываю это направление обсуждения.
0
|
|||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||
| 25.02.2016, 20:39 | ||||||||||||
|
ваш Кэп. стандарт вообще никому ничего не запрещает. Кэпа можно не благодарить. и они это делают. и ссылку на параграф. программист сказал - максимальная скорость, и понеслось... когда есть такая техническая возможность, и это не противоречит стратегии оптимизации. если выставленна настройка "оптимизировать по скорости", то причиной отказа от инлайна может послужить оптимизация связанная с кэшем и конвейерами процессора, например. это ситуация, когда перфоманс не страдает. и возвращаясь к нашим баранам - по классической схеме постфикс оптимизируется до префикса на ура.
0
|
||||||||||||
|
Модератор
|
||
| 25.02.2016, 21:23 | ||
|
1
|
||
|
Игогошка!
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
|
|
| 25.02.2016, 22:34 | |
|
hoggy, сможешь продемонстрировать, что, например, постфикс от std::istream_iterator<std::string>действ ительно оптимизируется всеми распространенными компиляторами?
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
| 25.02.2016, 23:22 | |
|
0
|
|
| 25.02.2016, 23:22 | |
|
Помогаю со студенческими работами здесь
58
Разница между вариантами цикла Есть ли разница в оптимизации между определением переменной до цикла Написать программу, преобразующую строку в префиксной форме в строку в постфиксной форме В чем разница между этими двумя способами записи? построить выражение в префиксной записи Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|