Постепенное увеличение итераторов: ++ это более эффективно, чем он ++? [дубликат]

Вы пробовали [textView sizeThatFits:textView.bounds]?

Редактирование: sizeThatFits возвращает размер, но на самом деле не изменяет размеры компонента. Я не уверен, является ли это тем, что Вы хотите, или если [textView sizeToFit] больше, что Вы искали. В любом случае я не знаю, будет ли он совершенно пригодный, содержание как Вы хочет, но это - первая вещь попробовать.

29
задан Ajay 26 October 2018 в 08:57
поделиться

7 ответов

Причина, по которой преинкремент работает быстрее, заключается в том, что постинкремент должен сделать копию старого значения для возврата. Как сказано в GotW # 2 : «Преинкремент более эффективен, чем постинкремент, потому что для постинкремента объект должен увеличивать себя, а затем возвращать временное значение, содержащее его старое значение. Обратите внимание, что это верно даже для встроенных функций, таких как int. "

GotW # 55 предоставляет каноническую форму постинкремента, которая показывает, что он должен выполнять преинкремент плюс еще некоторая работа:

T T::operator++(int)
{
  T old( *this ); // remember our original value
  ++*this;        // always implement postincrement
                  //  in terms of preincrement
  return old;     // return our original value
}

Как отмечали другие, некоторые компиляторы могут оптимизировать это в некоторых случаях , но если вы не используете возвращаемое значение, рекомендуется не полагаться на эту оптимизацию. Кроме того, разница в производительности, вероятно, будет очень небольшой для типов, которые имеют тривиальные конструкторы копирования,

35
ответ дан 28 November 2019 в 01:27
поделиться

Вряд ли это будет иметь значение для вектора.

В общем, ++ it вряд ли будет медленнее, чем it ++ ( предполагая разумную реализацию, если они перегружены), и может быть быстрее. Причина в том, что если сам класс итератора вообще сложен, то поскольку it ++ должен вернуть значение до того, как it будет увеличено, реализация обычно сделает копию.

Векторные итераторы, вероятно, являются «просто указателями» (в оптимизированных, неотладочных сборках), и оба operator ++ будут встроены. Поскольку возвращаемое значение не используется, копия обычно пропускается. Так что никакой разницы не будет. Я имею обыкновение набирать ++ it , потому что:

1) Когда-нибудь это может иметь значение,

9
ответ дан 28 November 2019 в 01:27
поделиться

it ++ выполняет следующие операции:

  1. создает копию it
  2. инкремент it
  3. возвращает оригинал (без увеличения) it

++ it выполняет следующие операции:

  1. инкремент it
  2. return it

Поскольку it ++ создает копию, он может можно сказать, что он «медленнее». Однако любой достойный компилятор оптимизирует эту разницу для большинства определенных типов. Для некоторых типов, определяемых пользователем, может быть быстрее.

5
ответ дан 28 November 2019 в 01:27
поделиться

Иногда да. С некоторыми он будет оптимизирован и останется таким же. Для std :: vector <> (и других std-итераторов) он, скорее всего, будет оптимизирован таким же образом.

3
ответ дан 28 November 2019 в 01:27
поделиться

да ++ это более эффективно, потому что ++ необходимо вернуть копию объекта, а затем увеличить его.

2
ответ дан 28 November 2019 в 01:27
поделиться

Да. Насколько я помню, ++ более эффективен, чем ++, потому что ++ создает временный объект, а ++ - нет.

0
ответ дан 28 November 2019 в 01:27
поделиться

Есть вероятность, что он ++ создаст временную копию.

Кроме того, в C ++ есть вероятность, что кто-то перегрузил оператор постинкремента.

Обе эти вещи могут снижение производительности по сравнению с прединкрементом. На практике это вряд ли будет иметь значение. В частности, временная копия будет оптимизирована большинством компиляторов, поскольку в третьем выражении цикла For отсутствуют побочные эффекты.

2
ответ дан 28 November 2019 в 01:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: