a ++ против a = a + 1, что полезно в эффективном программировании памяти и как? - PullRequest
4 голосов
/ 17 декабря 2010

Это был мой вопрос об интервью в HP. Я ответил, что ++ требует меньше инструкций по сравнению с a = a +1;

Я хочу знать, что полезно в эффективном программировании, и как они отличаются друг от друга ..?

Надеясь на быстрый и положительный ответ ..

Ответы [ 11 ]

18 голосов
/ 17 декабря 2010

В C не будет никакой разницы, если компилятор умный.

В C ++ это зависит от типа a и от того, перегружен ли оператор ++.Чтобы еще больше усложнить ситуацию, оператор = также может быть перегружен, и a = a + 1 может не совпадать с a++.Даже при сложностях more оператор + также может быть перегружен, поэтому невинно выглядящий фрагмент кода, такой как a = a + 1, может иметь серьезные последствия.

Так что без некоторого контекстаВы просто не можете знать.

7 голосов
/ 17 декабря 2010

Прежде всего, в C ++ это будет зависеть от типа a. Ясно, что a может относиться к классу и иметь перегруженные операторы, и, не зная деталей, невозможно решить, какой из них эффективнее.

Тем не менее, как в C, так и в C ++ все, что выглядит чище, предпочтительнее. Сначала напишите четкий код, затем профилируйте его и посмотрите, будет ли он невыносимо медленным.

4 голосов
/ 17 декабря 2010

Я думаю, что отвечу независимым от реализации способом.a++ мне легче читать, потому что он просто показывает мне, что он делает.Принимая во внимание, что для a = a + 1 я сначала должен просмотреть все дополнение.Я предпочитаю делать выбор, который более надежен.

Первый, a++, оценивает значение prior , так что вы можете использовать его для выражения вещей иногда на удивление более простыми способами.Например,

// copy, until '\0' is hit.
while(*dest++ = *source++) ;

Помимо этих соображений, я не думаю, что какие-либо из них более эффективны, если предположить, что вам приходится иметь дело с базовыми целочисленными типами.

2 голосов
/ 17 декабря 2010

Я не специалист по проектированию микропроцессоров, но, думаю, многие процессоры имеют инструкции INC или DEC. Если тип данных int, то приращение может быть сделано в одной инструкции. Но a = a + 1 требует больше, сначала добавить, а затем присваивать. Таким образом, ++ должен быть быстрее, очевидно, предполагая, что a не является сложным типом данных.

Однако, умная компиляция должна выполнять такую ​​оптимизацию. Итак, вкратце, это сложное интервью или экзаменационный вопрос, практически не имеющий реальной ценности, если вы не работаете с не таким умным компилятором.

1 голос
/ 17 декабря 2010

С оптимизирующим компилятором они идентичны. Вопрос об интервью спорный.

0 голосов
/ 04 октября 2015
++a;
a+=1;
a=a+1;

Какие обозначения мы должны использовать? Зачем?

Мы предпочитаем первую версию, ++ a , потому что она более прямо выражает идею приращения. Он говорит о том, что мы хотим сделать (с приращением a), а не о том, как это сделать.  (добавьте 1 к a, а затем запишите результат в a).

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

Результат является более кратким и легким для понимания читателем. Если бы мы написали a = a + 1, читатель мог легко задаться вопросом, действительно ли мы хотели увеличить на 1.

Может быть, мы просто опечатали a = b + 1 , a = a + 2 или даже a = a – 1 .

С ++ a возможностей для таких сомнений гораздо меньше.

Примечание. Это логический аргумент о читабельности и корректности, а не аргумент об эффективности. Вопреки распространенному мнению. Современные компиляторы имеют тенденцию генерировать точно такой же код из a = a + 1 , что и для ++ a , когда a является одним из встроенных типов.

0 голосов
/ 07 сентября 2011

a ++ лучше, чем + 1, потому что в случае чисел с плавающей запятой a ++ увеличивается более эффективно, чем a = a + 1. То есть a ++ увеличивает значение ровно на 1, и округление не происходит.

0 голосов
/ 17 декабря 2010

из http://www.parashift.com/c++-faq-lite/operator-overloading.html#faq-13.15:

++ i иногда быстрее и никогда не медленнее, чем i ++.

0 голосов
/ 17 декабря 2010

На самом деле все сводится к тому, что оптимизирует ваш компилятор.

Давайте возьмем оптимальный случай, когда a является целым.Тогда обычно ваш компилятор делает a++ и a=a+1 абсолютно одинаковыми.

Теперь можно отметить, что a = a + 1; просто увеличивает значение фиксированной величины 1, тогда как a++ увеличивает значение 1 типа переменной.Так что если это int, float и т. Д., То вы получите 1-> 2, 3.4-> 4.4 в обоих случаях.

Но если a - указатель на массив / список и т. Д., Вы будетебыть в состоянии изменить указатель на следующий элемент в списке / массиве при использовании a++, в то время как a = a+1 может делать что-то еще или не работать вообще.


Короткий длинный ответ, я быскажем a++ лучше:

  • ваш код яснее и короче
  • вы можете манипулировать более широким диапазоном типов переменных
  • и должны быть более эффективными, поскольку (Я думаю, но я не уверен) ++ - это базовый оператор того же уровня, что и << и т. Д .: он напрямую изменяет переменную, в то время как a = a + 1, если не оптимизирован вашим компилятором, потребует больше операций длядобавление с другим номером.
0 голосов
/ 17 декабря 2010

Во многих случаях даже более эффективно в ++ a. Когда a является целым или указателем, это не имеет никакого значения.

Обоснование того, почему эти приращения более эффективны, чем a=a+1, заключается в том, что инструкция приращения - это одна инструкция, тогда как инструкции, добавляющие 1 к a и присваивающие его обратно, выглядят примерно так:

получить адрес положить его содержимое в стек нажмите 1 в стек добавить их получить адрес (возможно, уже сохраненный) запись (pop) из стека в этот адрес

...