看板 C_and_CPP 關於我們 聯絡資訊
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