對於一個面向外部的組件(即編寫一個庫時第三方會消耗),我會帶一個指針,它讓用戶知道你要修改他們傳入的內容。這是以指針解引用爲代價的它具有非常小的性能成本 - 因爲在使用它之前您需要檢查指針不是NULL
。
對於不打算公開的內部函數,通過引用是優選的,因爲它更容易編寫,並且(同樣,只是非常輕微)更高性能。
鏗鏘沒有的優化:
00000000004004c0 <_Z10doThingRefRi>:
4004c0: 48 89 7c 24 f8 mov %rdi,-0x8(%rsp)
4004c5: 48 8b 7c 24 f8 mov -0x8(%rsp),%rdi
4004ca: 8b 07 mov (%rdi),%eax
4004cc: 05 01 00 00 00 add $0x1,%eax
4004d1: 89 07 mov %eax,(%rdi)
4004d3: c3 retq
4004d4: 66 66 66 2e 0f 1f 84 data32 data32 nopw %cs:0x0(%rax,%rax,1)
4004db: 00 00 00 00 00
00000000004004e0 <_Z10doThingPtrPi>:
4004e0: 48 89 7c 24 f8 mov %rdi,-0x8(%rsp)
4004e5: 48 81 7c 24 f8 00 00 cmpq $0x0,-0x8(%rsp)
4004ec: 00 00
4004ee: 0f 84 0f 00 00 00 je 400503 <_Z10doThingPtrPi+0x23>
4004f4: 48 8b 44 24 f8 mov -0x8(%rsp),%rax
4004f9: 8b 08 mov (%rax),%ecx
4004fb: 81 c1 01 00 00 00 add $0x1,%ecx
400501: 89 08 mov %ecx,(%rax)
400503: c3 retq
400504: 66 66 66 2e 0f 1f 84 data32 data32 nopw %cs:0x0(%rax,%rax,1)
40050b: 00 00 00 00 00
鏗鏘和-O3
00000000004004c0 <_Z10doThingRefRi>:
4004c0: ff 07 incl (%rdi)
4004c2: c3 retq
4004c3: 66 66 66 66 2e 0f 1f data32 data32 data32 nopw %cs:0x0(%rax,%rax,1)
4004ca: 84 00 00 00 00 00
00000000004004d0 <_Z10doThingPtrPi>:
4004d0: 48 85 ff test %rdi,%rdi
4004d3: 74 02 je 4004d7 <_Z10doThingPtrPi+0x7>
4004d5: ff 07 incl (%rdi)
4004d7: c3 retq
4004d8: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
4004df: 00
什麼是你的 「更好」 的標準是什麼? –
相關:http://programmers.stackexchange.com/questions/214997/reference-vs-dereference-pointers-in-arguments-c-c –