Does the compiler iterate through a pointer and whether it is an iteration of the index creates the same code? The problem comes from the "THE C Program Language" Chapter 5 Exercise 8.
The test code is as follows: (automatically generates console applications using VC.NET wizard)
#include "stdafx.h"
Void Fi (char v []) // line 5
{
For (int i = 0; v [i]! = 0; i) {
v [i] = 1;
}
}
Void fp (char v []) // line 12
{
For (char * p = v; * p! = 0; p) {
* PA = 1;
}
}
INT _TMAIN (int Argc, _tchar * argv []) // Line 19
{
Char a [8] = {'A', 'B', 'C', 'D', 'E', 'F', 'g', 'h'};
FP (a);
Fi (a);
Return 0;
}
Use the parameter FA on VC 7.NET, and the assembly code generated is as follows (not optimized):
Listing generated by Microsoft (R) Optimizing Compiler Version 13.10.3077
Title ./5_8.cpp
.386P
INCLUDE LISTING.INC
... ...
IncludeLib LibCD
IncludeLib OldNames
PUBLIC? FI @@ yaxqad @ z; fi, function fi code start
EXTRN __RTC_INITBASE: NEAR
EXTRN __RTC_SHUTDOWN: NEAR
COMDAT RTC $ IMZ
File D: /VSProject/5_8/5_8.cpp
RTC $ IMZ Segment
__RTC_INITBASE.RTC $ IMZ DD FLAT: __ RTC_INITBASE
RTC $ IMZ Ends
COMDAT RTC $ TMZ
RTC $ TMZ Segment
__RTC_SHUTDOWN.RTC $ TMZ DD FLAT: __ RTC_SHUTDOWN
Function Compile Flags: / ODT / RTCSU / ZI
RTC $ TMZ ENDS
COMDAT? FI @@ yaxqad @ z
_Text segment
_i $ 10435 = -8; SIZE = 4
_v $ = 8; size = 4
? Fi @@ yaxqad @ z proc Near; Fi, Comdat
LINE 6
Push EBP
MOV EBP, ESP
SUB ESP, 204; 000000CCH
Push EBX
PUSH ESI
Push EDI
Lea EDI, DWORD PTR [EBP-204] MOV ECX, 51; 00000033H
Mov Eax, -858993460; cccccccch
Rep StosD
Line 7 // *******************************
Mov DWORD PTR _i $ 10435 [EBP], 0
JMP SHORT $ l10436
$ L10437:
Mov Eax, DWORD PTR _i $ 10435 [EBP]
Add Eax, 1
Mov DWORD PTR _I $ 10435 [EBP], EAX
$ L10436:
MOV Eax, DWORD PTR _V $ [EBP]
Add Eax, DWORD PTR _I $ 10435 [EBP]
Movsx ECX, Byte Ptr [EAX]
Test ECX, ECX
JE SHORT $ l10434
Line 8
MOV Eax, DWORD PTR _V $ [EBP]
Add Eax, DWORD PTR _I $ 10435 [EBP]
Movsx ECX, Byte Ptr [EAX]
Add ECX, 1
MOV EDX, DWORD PTR _V $ [EBP]
Add Edx, DWORD PTR_I $ 10435 [EBP]
MOV BYTE PTR [EDX], CL
LINE 9
JMP SHORT $ l10437
$ L10434:
Line 10
POP EDI
POP ESI
POP EBX
MOV ESP, EBP
POP EBP
Ret 0
? Fi @@ yaxqad @ z endp; fi
_Text Ends
PUBLIC? FP @@ yaxqad @ z; fp, function fp code start
Function Compile Flags: / ODT / RTCSU / ZI
COMDAT? FP @@ yaxqad @ z
_Text segment
_P $ 10442 = -8; SIZE = 4
_v $ = 8; size = 4
? fp @@ yaxqad @ z proc Near; FP, Comdat
LINE 13
Push EBP
MOV EBP, ESP
SUB ESP, 204; 000000CCH
Push EBX
PUSH ESI
Push EDI
Lea EDI, DWORD PTR [EBP-204]
MOV ECX, 51; 00000033H
Mov Eax, -858993460; cccccccch
Rep StosD
LINE 14 // **************************************
MOV Eax, DWORD PTR _V $ [EBP]
Mov DWORD PTR _P $ 10442 [EBP], EAXJMP SHORT $ l10443
$ L10444:
MOV EAX, DWORD PTR _P $ 10442 [EBP]
Add Eax, 1
MOV DWORD PTR _P $ 10442 [EBP], EAX
$ L10443:
MOV EAX, DWORD PTR _P $ 10442 [EBP]
Movsx ECX, Byte Ptr [EAX]
Test ECX, ECX
JE SHORT $ l10441
LINE 15
MOV EAX, DWORD PTR _P $ 10442 [EBP]
Movsx ECX, Byte Ptr [EAX]
Add ECX, 1
Mov EDX, DWORD PTR _P $ 10442 [EBP]
MOV BYTE PTR [EDX], CL
LINE 16
JMP SHORT $ l10444
$ L10441:
LINE 17
POP EDI
POP ESI
POP EBX
MOV ESP, EBP
POP EBP
Ret 0
? fp @@ yaxqad @ z endp; fp
_Text Ends
Public _main
EXTRN @ _RTC_CheckstackVars @ 8: Near
EXTRN __RTC_CHECKESP: NEAR
Function Compile Flags: / ODT / RTCSU / ZI
Comard_main
... ...
End
Note that the assembled statements before and after LINE8 and LINE15 are exactly the same. That is, without any optimization, iterates the iteration through the pointer and iterates the same code.
What is the result if it is fully optimized? For the same file, use Release in VC7.NET, open global optimization, the resulting assembly code is as follows. It can be seen that the code of the two functions is still the same.
Listing generated by Microsoft (R) Optimizing Compiler Version 13.10.3077
Title ./5_8.cpp
.386P
INCLUDE LISTING.INC
... ...
Includelib Libc
IncludeLib OldNames
PUBLIC? FI @@ yaxqad @ z; fi, function fi code start
Function Compile Flags: / OGTY
COMDAT? FI @@ yaxqad @ z
_Text segment
_v $ = 8; size = 4
? Fi @@ yaxqad @ z proc Near; Fi, Comdat
File D: /VSProject/5_8/5_8.cpp
LINE 7
MOV EAX, DWORD PTR _V $ [ESP-4]
CMP Byte Ptr [EAX], 0
JE SHORT $ 1624
NPAD 7
$ L9622:
Line 8
Inc Byte PTR [EAX]
Mov Cl, Byte PTR [EAX 1]
INC EAX
TEST CL, CL
JNE SHORT $ 1622
$ L9624:
Line 10
Ret 0
? Fi @@ yaxqad @ z endp; fi
_Text Ends
PUBLIC? FP @@ yaxqad @ z; fp, function fp code start
Function Compile Flags: / OGTY
COMDAT? FP @@ yaxqad @ z
_Text segment
_v $ = 8; size = 4
? fp @@ yaxqad @ z proc Near; FP, Comdat
LINE 14
MOV EAX, DWORD PTR _V $ [ESP-4]
CMP Byte Ptr [EAX], 0
Je Short $ l9631
NPAD 7
$ L9629:
LINE 15
Inc Byte PTR [EAX]
Mov Cl, Byte PTR [EAX 1]
INC EAX
TEST CL, CL
JNE SHORT $ 1629
$ L9631:
LINE 17
Ret 0
? fp @@ yaxqad @ z endp; fp
_Text Ends
Public _main
EXTRN ___ security_cookie: DWORD
EXTRN @__ security_check_cookie @ 4: Near
Function Compile Flags: / OGTY
Comard_main
... ...
End