对于面向外部的组件(即在编写第三方将使用的库时),我会使用一个指针,它让用户知道您将修改他们传入的内容。这是以指针取消引用为代价的,它有一个非常非常小的性能成本 - 因为您需要NULL
在使用它之前检查指针是否。
对于不打算公开的内部函数,通过引用传递是更可取的,因为它更容易编写并且(同样,只是非常轻微)性能更高。
有clang并且没有优化:
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