作者littleshan (我要加入剑道社!)
看板C_and_CPP
标题Re: [问题] malloc问题
时间Mon Mar 16 20:15:24 2009
1F:推 littleshan:传 reference 效能和 pointer 一样,并不会比较快 03/16 18:13
2F:推 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 完全相同。
3F:推 Killercat:在32bit系统下,4byte以下的资料两者效能是一样的 03/16 18:30
4F:→ Killercat:因为reference = pointer, 32-bit系统下是4bytes 03/16 18:30
5F:→ Killercat:所以基本上pass pointer的话,传ref不但没意义,而且.. 03/16 18:31
6F:→ Killercat:我不觉得&*很好阅读 -_- 况且有时还有const问题 03/16 18:31
7F:→ Killercat:说错 4byte下两者一样, 4bytes以下ref还会慢一点 03/16 18:32
8F:→ Killercat:当然4bytes以下的资料非常少见就是 03/16 18:32
你好像误会什麽了
他是要去改变引数的内容
所以要嘛传 reference 要嘛传 pointer
而这种情况下两者做的事是一样的
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 59.115.146.106
9F:推 HudsonE:其实用 compiler 观点下去想就好了, 不使用 pointer 03/16 22:52
10F:→ HudsonE:有什麽 magical 的方法实现 reference 呢? 03/16 22:53
11F:→ HudsonE:谜之声: 那就用 register 吧... (咦) 03/16 22:54