あなたの唯一の意図はNUMの値をインクリメントすることであれば、第一及び第二の方法は、に同じintented結果が得られます呼び出し先メソッド。
次のようにコードを変更する場合は、あなたは、GCC(アセンブリレベルのコード)によって生成されたコードの違いを見ることができます:
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);
}
今使ってコンパイル:gccの-masm =インテル - S structTest.c -o structTest.s gccがアセンブリコードを生成するように求めます。
structTest.sをテキストエディタで開きます。
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
そして、あなたはインクリメントを事前に操作を変更したときに、follwoingコードが生成されます。
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
だから、あなたは、第二の場合には、コンパイラがNUM値とパスをインクリメントしていることがわかりますこのnum値でprintf()を呼び出します。
性能面では、メモリ位置に触れる回数が少ないため、ポストインクリメントが効率的になると思います。
重要な行は、上記のコードで**の間にマークされています。