ฉันสังเกตเห็นว่ามีคนบอกว่ามันได้รับการปรับให้เหมาะสมโดยค่าเริ่มต้นโดยคอมไพเลอร์สมัยใหม่ที่ "ฉลาด" โดยดูที่ผลลัพธ์โดยไม่ต้องปรับให้เหมาะสม ฉันพยายาม:
รหัส C ขั้นต่ำ:
#include <stdio.h>
#include <string.h>
int main()
{
char *s="aaaa";
for (int i=0; i<strlen(s);i++)
printf ("a");
return 0;
}
คอมไพเลอร์ของฉัน: g ++ (Ubuntu / Linaro 4.6.3-1ubuntu5) 4.6.3
คำสั่งสำหรับการสร้างรหัสแอสเซมบลี: g ++ -S -masm = intel test.cpp
Gotten assembly code at the output:
...
L3:
mov DWORD PTR [esp], 97
call putchar
add DWORD PTR [esp+40], 1
.L2:
THIS LOOP IS HERE
**<b>mov ebx, DWORD PTR [esp+40]
mov eax, DWORD PTR [esp+44]
mov DWORD PTR [esp+28], -1
mov edx, eax
mov eax, 0
mov ecx, DWORD PTR [esp+28]
mov edi, edx
repnz scasb</b>**
AS YOU CAN SEE it's done every time
mov eax, ecx
not eax
sub eax, 1
cmp ebx, eax
setb al
test al, al
jne .L3
mov eax, 0
.....