Se la tua unica intenzione è quella di incrementare il valore di num poi il 1 ° e 2 ° metodo produrrà lo stesso risultato intented a il metodo del callee.
Tuttavia, se si cambia il codice di seguito, si può vedere la differenza tra il codice generato da gcc (codice livello di assieme):
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);
}
Ora compilarlo usando: gcc -masm = intel - S structTest.c -o structTest.s Questo chiede gcc per generare il codice assembly:
Aprire structTest.s in un editor di testo.
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
E quando si cambia l'operazione di pre-incremento, il codice follwoing viene generato:
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
Quindi, si vedrebbe che nel secondo caso, il compilatore incrementa il valore num e passaggi su questo valore numerico per printf().
In termini di prestazioni, mi aspetto che il post-incremento sia più efficiente poiché le posizioni di memoria vengono toccate un numero inferiore di volte.
Le linee importanti sono state contrassegnate tra ** nel codice precedente.