Wenn Ihre einzige Absicht, den Wert von num zu erhöhen, ist dann der 1. und 2. Methode gleiche intented Ergebnis liefern zu die aufgerufene Methode.
Wenn Sie jedoch Ihren Code auf die folgenden ändern, können Sie den Unterschied zwischen dem Code sehen von gcc (Baugruppenebene Code) generiert:
struct my_struct
{
int num;
};
void foo(struct my_struct* my_ptr)
{
printf("\nPost Increment: %d", my_ptr->num++);
}
int main()
{
struct my_struct a;
a.num = 10;
foo(&a);
}
es jetzt kompilieren mit gcc -masm = Intel - S structTest.c -o structTest.s Dies fragt GCC, um den Assembly-Code zu generieren:
Öffnen Sie structTest.s in einem Texteditor.
foo:
.LFB0:
push rbp
mov rbp, rsp
sub rsp, 16
**mov QWORD PTR [rbp-8], rdi**
mov rax, QWORD PTR [rbp-8]
mov eax, DWORD PTR [rax]
mov edx, eax
**lea ecx, [rax+1]**
mov rax, QWORD PTR [rbp-8]
mov DWORD PTR [rax], ecx
mov eax, OFFSET FLAT:.LC0
mov esi, edx
mov rdi, rax
mov eax, 0
call printf
leave
ret
.cfi_endproc
main:
.LFB1:
push rbp
mov rbp, rsp
sub rsp, 16
**mov DWORD PTR [rbp-16], 10
lea rax, [rbp-16]
mov rdi, rax
call foo**
leave
ret
.cfi_endproc
Und wenn man den Betrieb ändern zu Schritt vor, wird der follwoing Code generiert:
foo:
.LFB0:
.cfi_startproc
push rbp
mov rbp, rsp
sub rsp, 16
**mov QWORD PTR [rbp-8], rdi**
mov rax, QWORD PTR [rbp-8]
mov eax, DWORD PTR [rax]
**lea edx, [rax+1]**
mov rax, QWORD PTR [rbp-8]
**mov DWORD PTR [rax], edx**
mov rax, QWORD PTR [rbp-8]
**mov edx, DWORD PTR [rax]**
mov eax, OFFSET FLAT:.LC0
mov esi, edx
mov rdi, rax
mov eax, 0
call printf
leave
ret
.cfi_endproc
Also, Sie, dass im zweiten Fall sehen würden, erhöht der Compiler den num Wert und Pässe auf diesen num-Wert für printf().
In Bezug auf die Leistung würde ich erwarten, dass das Post-Inkrement effizienter ist, da die Speicherorte weniger oft berührt werden.
Die wichtigen Zeilen wurden im obigen Code zwischen ** markiert.