Почему в Visual Studio по умолчанию для автозаполнения для l oop используется пост-инкремент i ++? - PullRequest
1 голос
/ 30 апреля 2020

, так это то, что дает Visual Studio при автоматическом заполнении для l oop. Мне сказали, что ++ i более эффективен, чем i ++, так как предварительное приращение не требует, чтобы компилятор создал временную переменную для хранения i. и что я должен использовать ++ i, если я на самом деле не требую i ++. есть ли какая-то причина, по которой visual studio делает это по умолчанию или я просто переосмысливаю это?

for (size_t i = 0; i < length; i++)
{

}

Ответы [ 2 ]

2 голосов
/ 30 апреля 2020

Некоторые из этих ответов основаны на моем опыте, а не на каких-либо неопровержимых фактах, поэтому, пожалуйста, примите это с недоверием.

Причины i ++ в качестве значения по умолчанию l oop incrementor

Постфикс x ++ создает временное выражение, которое передается в выражении «вверх», а переменная x впоследствии увеличивается.

Префикс ++ x не создает временный объект, но увеличивает значение «x» и передает результат для выражения.

Производительность

Рассматривая два простых цикла, один с использованием i ++, а другой ++ i, давайте рассмотрим сгенерированную сборку

#include <stdio.h>

int main()
{ 
    for (int i = 0; i < 5; i++) {
     //        
   }

   for (int j = 0; j < 5; ++j) {
       //
   }


    return 0;
}

Создает следующую сборку, используя G CC:

main:
        push    rbp
        mov     rbp, rsp
        mov     DWORD PTR [rbp-4], 0
.L3:
        cmp     DWORD PTR [rbp-4], 4
        jg      .L2
        add     DWORD PTR [rbp-4], 1
        jmp     .L3
.L2:
        mov     DWORD PTR [rbp-8], 0
.L5:
        cmp     DWORD PTR [rbp-8], 4
        jg      .L4
        add     DWORD PTR [rbp-8], 1
        jmp     .L5
.L4:
        mov     eax, 0
        pop     rbp
        ret

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

Внешний вид

Глядя на следующие три цикла, какой из них вам наиболее эстетически нравится?

   for (int i = 0; i < 5; i++) {
     //        
   }

   for (int i = 0; i < 5; ++i) {
       //
   }

   for (int i = 0; i < 5; i+=1) {
       //
   }

Для меня i + = 1 прямо, а ++ мне просто кажется ... назад

Эргономика

  • i ++ ) - Ваша рука уже находится в правильном положении для ввода) после ввода ++
  • ++ i) - Требуется переход от верхнего ряда к Гомерову и обратно

История

Старые C программисты и нынешние C программисты, которые пишут код системного уровня, часто используют i ++ для написания очень компактного кода, такого как:

// print some char * s
while(*s)
    putc(*s++);

// strcpy from src to dest
while (*dest++=*src++);

Из-за этого i ++ стал инкремент C, которого программисты достигают первыми, в конечном итоге становится своего рода стандартом в тех случаях, когда ++ i и i ++ имеют одинаковые функциональные возможности.

0 голосов
/ 30 апреля 2020

Выбор ++i вместо этого будет просто выбором стиля .

В этом контексте не будет никакого повышения производительности . Это миф.

i++ также более «обычен» для простого l oop сверх int s.

Вы, конечно, можете написать свой собственный l oop в вашем собственном стиле!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...