האם יש הבדל מהירות בין לולאות קדימה, בזמן, בזמן ובזמן ללינים מקוננים ב- C / C ++?


תשובה 1:
int
עיקרי (int argc, char * argv [])
{
   int i, g = 0xf;

   עבור (i = 0; i <16; i ++)
     g--;
}
int
עיקרי (int argc, char * argv [])
{
   int i = 0, g = 0xf;

   עשה {
      g--;
      i ++;
   } while (i <16);
}
int
עיקרי (int argc, char * argv [])
{
   int i = 0, g = 0xf;

   בזמן (i <16) {
      g--;
      i ++;
   };
}
        .fil "main_for.c"
        טקסט
        גלוב הראשי
        .type main, @ function
עיקרי:
.LFB0:
        .cfi_startproc
        pushq% rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq% rsp,% rbp
        .cfi_def_cfa_register 6
        movl% edi, -20 (% rbp)
        movq% rsi, -32 (% rbp) <--- הכל מעל זה הוא תוכנה
        movl $ 15, -8 (% rbp) <- המשתנה שלנו g
        movl $ 0, -4 (% rbp) <- המשתנה שלנו i
        jmp .L2
.L3:
        subl $ 1, -8 (% rbp) <--- צמצום ז
        addl $ 1, -4 (% rbp) <--- תוספת i
.L2:
        cmpl $ 15, -4 (% rbp) <--- השווה i ל 15
        jle .L3 <---- קפוץ לאיטרציה הבאה אם ​​פחות או שווה
        popq% rbp <----- כל מה שמתחת זה ניקוי התוכנית
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc
.LFE0:
        .גודל עיקרי,.-עיקרי
        .ident "GCC: (Gentoo 4.7.3-r1 p1.4, pie-0.5.5) 4.7.3"
        . סעיף. הערה. מחסנית GNU, "", @ progbits
        movl $ 0, -4 (% rbp) <- המשתנה שלנו i
        movl $ 15, -8 (% rbp) <- המשתנה שלנו g
        jmp .L2
.L3:
        subl $ 1, -8 (% rbp) <--- צמצום ז
        addl $ 1, -4 (% rbp) <--- תוספת i
.L2:
        cmpl $ 15, -4 (% rbp) <--- השווה i ל 15
        jle .L3 <---- קפוץ לאיטרציה הבאה אם ​​פחות או שווה
        movl $ 0, -4 (% rbp)
        movl $ 15, -8 (% rbp)
.L2:
        מכפיל 1 $ -8 (% rbp)
        addl $ 1, -4 (% rbp)
        cmpl $ 15, -4 (% rbp)
        jle .L2
       .fil "main_for.c"
        .section .text.startup, "גרזן", @ progbits
        .p2 קו 4,, 15
        גלוב הראשי
        .type main, @ function
עיקרי:
.LFB0:
        .cfi_startproc
        נציג
        ret
        .cfi_endproc
.LFE0:
        .גודל עיקרי,.-עיקרי
        .ident "GCC: (Gentoo 4.7.3-r1 p1.4, pie-0.5.5) 4.7.3"
        . סעיף. הערה. מחסנית GNU, "", @ progbits
עיקרי:
.LFB0:
        .cfi_startproc
        movl 15 $, -4 (% rsp) <----- מצב סוף מחושב i (cecI)
        movl $ 16,% eax <------- המשתנה g שלנו בפנקס
        .p2 קו 4,, 10
        .p2 קו 3
.L2:
        movl -4 (% rsp),% edx <---- העבר cecI לרשם
        subl $ 1,% edx <--- צמצום CECI
        subl $ 1,% eax <--- צמצום g לפי הרשמה
        movl% edx, -4 (% rsp) <- העבר הרשמה ל- cecI
        jne .L2
        נציג
        ret
.LFB0:
        .cfi_startproc
        movl $ 15, -4 (% rsp)
        movl $ 16,% eax
        .p2 קו 4,, 10
        .p2 קו 3
.L2:
        movl -4 (% rsp),% edx
        subl $ 1,% edx
        subl $ 1,% eax
        movl% edx, -4 (% rsp)
        jne .L2
int
עיקרי (int argc, char * argv [])
{
   int x, y;
   g נדיף = 0xf;

   עבור (y = 0; y <16; y ++) {
      עבור (x = 0; x <10; x ++) {
         g--;
      }
   }
}
int
עיקרי (int argc, char * argv [])
{
   int x, y = 0;
   g נדיף g = 0xf;

   עבור (y = 0; y <16; y ++, x = 0) {
      בעוד (x ++ <10) {
         g--;
      }
   }
}
עיקרי:
.LFB0:
        .cfi_startproc
        movl $ 15, -4 (% rsp)
        movl $ 16,% ecx
        .p2 קו 4,, 10
        .p2 קו 3
.L2:
        movl 10 $,% eax
        .p2 קו 4,, 10
        .p2 קו 3
.L3:
        movl -4 (% rsp),% edx
        subl $ 1,% edx
        subl $ 1,% eax
        movl% edx, -4 (% rsp)
        jne .L3
        subl $ 1,% ecx
        jne .L2