推 littleshan:傳 reference 效能和 pointer 一樣,並不會比較快 03/16 18:13
推 chrisdar: 傳指標的話 有的時候還要 *p 取值 03/16 18:28
傳 reference 本質上還是傳 pointer 呀
只是 dereference 的時候 compiler 幫你做掉了
直接來看 assembly 就知道了
#include <cstdlib>
void alloc_mem(int** p)
{
*p = (int*)malloc(sizeof(int));
}
void alloc_mem(int*& p)
{
p = (int*)malloc(sizeof(int));
}
使用 gcc 編出的結果:
_Z9alloc_memRPi: ; alloc_mem(int*&)
.LFB14:
pushq %rbx
.LCFI0:
movq %rdi, %rbx
movl $4, %edi
call malloc
movq %rax, (%rbx)
popq %rbx
ret
...
_Z9alloc_memPPi: ; alloc_mem(int**)
.LFB13:
pushq %rbx
.LCFI1:
movq %rdi, %rbx
movl $4, %edi
call malloc
movq %rax, (%rbx)
popq %rbx
ret
兩邊的 assembly 完全相同。
推 Killercat:在32bit系統下,4byte以下的資料兩者效能是一樣的 03/16 18:30
→ Killercat:因為reference = pointer, 32-bit系統下是4bytes 03/16 18:30
→ Killercat:所以基本上pass pointer的話,傳ref不但沒意義,而且.. 03/16 18:31
→ Killercat:我不覺得&*很好閱讀 -_- 況且有時還有const問題 03/16 18:31
→ Killercat:說錯 4byte下兩者一樣, 4bytes以下ref還會慢一點 03/16 18:32
→ Killercat:當然4bytes以下的資料非常少見就是 03/16 18:32
你好像誤會什麼了
他是要去改變引數的內容
所以要嘛傳 reference 要嘛傳 pointer
而這種情況下兩者做的事是一樣的
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.115.146.106
推 HudsonE:其實用 compiler 觀點下去想就好了, 不使用 pointer 03/16 22:52
→ HudsonE:有什麼 magical 的方法實現 reference 呢? 03/16 22:53
→ HudsonE:謎之聲: 那就用 register 吧... (咦) 03/16 22:54