引用传递和指针传递相比,谁的效率更高。

lcy_888 2011-04-10 11:15:16
如题,需要兼顾时间与空间效率。有如下代码,哪个是指针传递,哪个是引用传递?
main()
{
DB_ENV *myEnv;
DB *dbp;
int ret;
u_int32_t env_flags;
CreateTable(*myEnv,dbp,ret,env_flags,_T("database.db"),_T("table1"));
}

void CreateTable(DB_ENV &sEnv,DB *sDbp,int &sRet,u_int32_t &sFlag,CString database_name,CString table_name)
{
sDbp=NULL;
sRet = db_create(&sDbp, &sEnv, 0);
sFlag = DB_CREATE;
sRet = sDbp->open(sDbp, NULL, database_name, table_name, DB_BTREE, sFlag, 0);
sDbp->close(sDbp,0);
}
...全文
1433 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
lcy_888 2011-04-18
  • 打赏
  • 举报
回复
牛人太多了,受教了,谢谢。
oldmtn 2011-04-14
  • 打赏
  • 举报
回复
学习了,,,,不过我从感觉上来说是用引用。。但是不知道为什么


今天懂了点,学习。。
QQ282881515 2011-04-13
  • 打赏
  • 举报
回复
一般建议:内置类型传指针
自定义类型传递引用比较好些
安乐风流 2011-04-13
  • 打赏
  • 举报
回复 1
[Quote=引用 17 楼 heartgoon2010 的回复:]
我觉得引用效率更高。
因为,指针传递实际上是值传递,形参是指针时,我们需要创建一个临时的形参指针,再将实参指针(实际上是变量的地址值)的值赋给它。这里会有一定的开销。
但是,引用传递就不存在这个问题,引用只是变量的一个别名而已,不需要额外创建变量。
[/Quote]

顶 肯定有差别有,引用快些,访问内存的次数少些。
Sou2012 2011-04-13
  • 打赏
  • 举报
回复
没有什么差别吧。
用户 昵称 2011-04-13
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 heartgoon2010 的回复:]
我觉得引用效率更高。
因为,指针传递实际上是值传递,形参是指针时,我们需要创建一个临时的形参指针,再将实参指针(实际上是变量的地址值)的值赋给它。这里会有一定的开销。
但是,引用传递就不存在这个问题,引用只是变量的一个别名而已,不需要额外创建变量。
[/Quote]
16:       int xx;
17:
18: a( &xx );
004010A8 lea eax,[ebp-4]
004010AB push eax
004010AC call @ILT+5(a) (0040100a)
004010B1 add esp,4
19: b( xx );
004010B4 lea ecx,[ebp-4]
004010B7 push ecx
004010B8 call @ILT+0(b) (00401005)
004010BD add esp,4
汇编中还真是没什么差别。
无水先生 2011-04-12
  • 打赏
  • 举报
回复
引用更好
lumin824 2011-04-12
  • 打赏
  • 举报
回复
用什么传递效率高主要看你在传递的时候是否在你不知情的时候构造了不需要的对象,你用指针或者引用都不会构造新的对象。

传指针和传引用就是表达形式上的不同,如果作为输入,可以加上const修饰,如果作为输出就不加。
在输出时传指针有个特点,就是一看到你的函数调用,能猜测出大概是作为输出的,因为前面有个&。
heartgoon2010 2011-04-12
  • 打赏
  • 举报
回复
我觉得引用效率更高。
因为,指针传递实际上是值传递,形参是指针时,我们需要创建一个临时的形参指针,再将实参指针(实际上是变量的地址值)的值赋给它。这里会有一定的开销。
但是,引用传递就不存在这个问题,引用只是变量的一个别名而已,不需要额外创建变量。
august_zhao 2011-04-11
  • 打赏
  • 举报
回复
没多大区别吧

习惯指针
ysjyniiq 2011-04-11
  • 打赏
  • 举报
回复
void CreateTable(DB_ENV &sEnv,DB *sDbp,int &sRet,u_int32_t &sFlag,CString database_name,CString table_name)
{
sDbp=NULL;
sRet = db_create(&sDbp, &sEnv, 0);
sFlag = DB_CREATE;
sRet = sDbp->open(sDbp, NULL, database_name, table_name, DB_BTREE, sFlag, 0);
sDbp->close(sDbp,0);
}
sRet = db_create(&sDbp, &sEnv, 0);//这行代码有毛病吧!!!代码有什么用意呢?&sDbp只是个临时地址
晓馨嫣梓 2011-04-11
  • 打赏
  • 举报
回复
其实引用不就是用指针实现的吗?
lcy_888 2011-04-11
  • 打赏
  • 举报
回复
这可能是BerkeleyDB的语法约定,请有BerkeleyDB使用经验的朋友支支招,谢了。
lcy_888 2011-04-11
  • 打赏
  • 举报
回复
写成DB &sDpb时,在实现函数中用sDpb(*sDpb,……)这样的方式时会报编译错误。
lcy_888 2011-04-10
  • 打赏
  • 举报
回复
CreateTable函数如果这样改写
void CreateTable(DB_ENV &sEnv,DB &sDbp,int &sRet,u_int32_t &sFlag,CString database_name,CString table_name)
如何在内部使用sDbp啊,使用BerkeleyDB的朋友请看一下。
zxhx 2011-04-10
  • 打赏
  • 举报
回复
没有差别~
King_hhuang 2011-04-10
  • 打赏
  • 举报
回复
差不多吧,看你自己喜欢怎么用啦
arong1234 2011-04-10
  • 打赏
  • 举报
回复
我估计没有任何效率差异,即使有,也是可以忽略的
用户 昵称 2011-04-10
  • 打赏
  • 举报
回复
差不多,俺肯定用指针。
Eleven 2011-04-10
  • 打赏
  • 举报
回复
两种都行,看个人意愿~
加载更多回复(5)

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧