Форум программистов, компьютерный форум CyberForum.ru

Разница между префиксной и постфиксной формой записи счетчика цикла - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Найти количество элементов массива, равных первому элементу http://www.cyberforum.ru/cpp-beginners/thread122150.html
ПОМОГИТЕ ПОЖАЛУЙСТА!!!! 1)Составить программу,которая находит количество элементов,равных первому элементу,и количество элементов,равных последнему,в мвссивах X(n) и Y(M).вычислить количество элементов(оформить в виде таблицы)!!!! 2,Получить квадратную матрицу порядка n. 1 2 3 ... n n n-1 n-3 1 ...
C++ Константы и выражения 1.Записать каждое десятичное число в виде целой десятичной, восьмеричной и шестнадцатеричной константы: 126 10 219 77 2.Записать каждое десятичное число в виде вещественной константы в форме с фиксированной точкой и экспоненциальной форме: 0,4335 4,3*10-2 778 0,005*102 3.еменная объявлена как float S. Определить значение результата каждой операции и значение переменной S... http://www.cyberforum.ru/cpp-beginners/thread122142.html
Выберите названия, содержащие хотя бы одно из заданных ключевых слов. C++
Помогите плиз решить задачу на С++ Заданный набор ключевых слов, а также текст, в котором хранится длинный список названий книг и научных работ. Выберите названия, содержащие хотя бы одно из заданных ключевых слов.
записать каждое десятичное C++
1. Записать каждое десятичное число в виде целой десятичной, восьмеричной и шестнадцатеричной константы: 55 219 143 79 2. Записать каждое десятичное число в виде вещественной константы в форме с фиксированной точкой и экспоненциальной форме: 99*10-1 1340 9,865 10000 3. Переменная объявлена как int S. Определить значение результата каждой операции и значение переменной S после...
C++ Как сделать, чтоб после появления нового символа, предыдущий менялся на пробел http://www.cyberforum.ru/cpp-beginners/thread122114.html
Есть цикл вот такой: int main() { string b,c; b = "+"; c = " "; int a = 0; for(int i = 0;i<=100000000;i++) {
C++ Среди всех n-значных чисел указать те, сумма цифр которых равна данному числу k. Среди всех n-значных чисел указать те, сумма цифр которых равна данному числу k. Помогите решить :) подробнее

Показать сообщение отдельно
TheCalligrapher
С чаем беда...
Эксперт С++
 Аватар для TheCalligrapher
2787 / 1433 / 393
Регистрация: 18.10.2014
Сообщений: 2,639
25.02.2016, 05:40     Разница между префиксной и постфиксной формой записи счетчика цикла
Цитата Сообщение от hoggy Посмотреть сообщение
почти верно. есть нюанс.
компиляторы уже давно научились стандартным RVO/NRVO оптимизациям.
и в ситуации, когда они фиксят, что снаружи значение никому не нужно,
они запросто могут выпилить конструктор
Почти верно, но есть нюанс.

Термины RVO и NRVO в своем каноническом значении относятся именно и только к ситуациям, когда возвращаемое значение именно нужно вызывающему коду. RVO и NRVO описывают стуации, когда внутреннему коду функции разрешается исключать формирование промежуточных локальные объектов (именованных или не именованных), и взамен формировать результат напрямую в объекте-приемнике, предоставленном вызывающим кодом.

Ситуации, когда результат вызова функции вообще никому не нужен, непосредственно к RVO и NRVO не относятся. Но если вам нравится включать в RVO и NRVO и такие ситуации - пожалуйста, включайте, никто вам не запретит. Термины RVO и NRVO, как никак, [полу-]неформальны.

Тем не менее это ничего не меняет. Реализация оптимизаций для случая игнорируемого значения все равно требует, как я сказал выше, либо run-time branching, либо генерации нескольких версий оператора, либо еще чего-то в этом роде. Ни один из этих вариантов не является "бесплатным".

Цитата Сообщение от hoggy Посмотреть сообщение
RVO/NRVO вообще то стандартны.
Замечательно Правильнее будет сказать: разрешены стандартом. Но это никоим образом ничего не меняет. К чему это здесь?

Цитата Сообщение от hoggy Посмотреть сообщение
их обязаны уметь все компиляторы.
Нет, конечно. Оптимизация - то всегда вопрос качества реализации (quality-of-implementation). Компилятор вообще имеет право ничего не уметь оптимизировать, а просто тупо транслировать код в строгом соответствии с правилами абстрактной C++-машины.

Цитата Сообщение от hoggy Посмотреть сообщение
и они их умеют уже с незапамятных времен.
RVO существует "с незапамятных времен". NRVO же существенно более позднее изобретение - его формально не существовало в C++98.

Цитата Сообщение от hoggy Посмотреть сообщение
все очень просто: стандарт разрешает компиляторам покласть болт
на любые возможные эффекты в конструкторах копий.
Это не верно. Стандарт разрешает компиляторам покласть болт на любые возможные эффекты в конструкторах временных (безымынных) копий. Вы пропустили очень важное слово "временных". На этом принципе было основано copy elision и RVO в С++98. Позже стандарт разрешил "покласть болт" и в ряде частных, четко очерченных случаев для именованных копий, что открыло возможности для NRVO.

Но в общем случае ваше утверждение неверно. В общем случае игнорировать конструкторы именованных копий компилятору не разрешается.

Цитата Сообщение от hoggy Посмотреть сообщение
например, когда значение снаружи все равно никому не нужно.
Опять мимо кассы. Речи идет не о том, что компилятор "может" или "не может", а о том, что его "может" не является бесплатным в сгенерированом коде и выливается либо в run-time branching, либо в code bloat.

Цитата Сообщение от hoggy Посмотреть сообщение
компилятор оптимизирует конструкцию вида:
C++Выделить код
1
obj++;
для любых типов так же просто,
как и для обычного инта.
Это совершено не верно. Оптимизация для типов, чья семантика прекрасно известна на уровне core language, и оптимизация для типов, чья семантика определена на уровне library/user code, отличается принципиально. Т.е. тут вообще даже смешно сравнивать - ничего общего эти оптимизации не имеют и ни о каком "так же просто" речи быть не может.

Собственно по этой причине мы и наблюдаем развития языка в сторону NRVO, move semantics и т.п. Эти свойства языка появились именно из-за мешающих оптимизациям принципиальных различий в семантике встроенных и пользовательских типов.
 
Текущее время: 18:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru