hur.cn - 华软网

 热门搜索

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

  作者:未知    来源:网络    更新时间:2011/4/10
如题,需要兼顾时间与空间效率。有以下代码,哪一个是指针传送,哪一个是引用传送?
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);
}
---华软 网友回答---
差不多,俺肯定用指针。

---华软网友回复---
我预计没有所有效率差异,即使有,也是能够忽略的

---华软网友回复---
差不多吧,看你自己喜欢怎么用啦
---华软网友回复---
没有差异~
---华软网友回复---
CreateTable函数如果这样改写
void CreateTable(DB_ENV &sEnv,DB &sDbp,int &sRet,u_int32_t &sFlag,CString database_name,CString table_name)
如何在内部运用sDbp啊,运用BerkeleyDB的朋友请看一下。
---华软网友回复---
一直不敢正视这个问题,今天终于有人提了,呵呵,学习下
---华软网友回复---
这不是蛋疼吗。。 引用就不是用对象的指针?
---华软网友回复---
这个好象看下,指针参数与引用参数的定义就明白了吧
---华软网友回复---
汇编代码下没有所有差异,几乎是一模一样的
---华软网友回复---
没有差异,在下层,传送和指针最终运用的实际参数都是一个地址。
我预计这两种类型是为了使高级语言更容易编写和纠错。
在高级语言中,如果你写成void CreateTable(DB_ENV *sEnv……)这样,那么sEnv所指就有可能是空隙址或不正确的地址。如果你写成void CreateTable(DB_ENV &sEnv……),那么除非你在实参中运用了*运算符,否则sEnv就不可能指向一个空隙址或毛病地址。
---华软网友回复---
两种都行,看个人意愿~
---华软网友回复---
写成DB &sDpb时,在实现函数中用sDpb(*sDpb,……)这样的方式时会报编译毛病。
---华软网友回复---
这可能是BerkeleyDB的语法约定,请有BerkeleyDB运用经验的朋友支支招,谢了。
---华软网友回复---
其实引用不就是用指针实现的吗?
---华软网友回复---
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只是个临时地址
---华软网友回复---
没多大区别吧

习气指针
---华软网友回复---
我觉得引用效率更高。
由于,指针传送实际上是值传送,形参是指针时,咱们需要创建一个临时的形参指针,再将实参指针(实际上是变量的地址值)的值赋给它。这里会有一定的开销。
然则,引用传送就不存留这个问题,引用只是变量的一个别名而已,不需要额外创建变量。
---华软网友回复---
用什么传送效率高主要看你在传送的时候是否在你不知情的时候构造了不需要的对象,你用指针或引用都不会构造新的对象。

传指针和传引用就是表达形式上的不同,如果作为输入,能够加上const修饰,如果作为输出就不加。
在输出时传指针有个特色,就是一看到你的函数调用,能猜想出大概是作为输出的,由于前面有个&。
---华软网友回复---
引用更好
---华软网友回复---
引用 17 楼 heartgoon2010 的回复:
我觉得引用效率更高。
由于,指针传送实际上是值传送,形参是指针时,咱们需要创建一个临时的形参指针,再将实参指针(实际上是变量的地址值)的值赋给它。这里会有一定的开销。
然则,引用传送就不存留这个问题,引用只是变量的一个别名而已,不需要额外创建变量。

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
汇编中还真是没什么差异。

---华软网友回复---
没有什么差异吧。
---华软网友回复---
引用 17 楼 heartgoon2010 的回复:
我觉得引用效率更高。
由于,指针传送实际上是值传送,形参是指针时,咱们需要创建一个临时的形参指针,再将实参指针(实际上是变量的地址值)的值赋给它。这里会有一定的开销。
然则,引用传送就不存留这个问题,引用只是变量的一个别名而已,不需要额外创建变量。


顶 肯定有差异有,引用快些,访问内存的次数少些。
---华软网友回复---
一般建议:内置类型传指针
          自定义类型传送引用对照好些
---华软网友回复---
  class="deleted_message"> 该回复于2011-04-13 17:07:50被版主删除
---华软网友回复---
学习了,,,,不过我从感觉上来说是用引用。。然则不知道为什么


今天懂了点,学习。。
---华软网友回复---
  class="deleted_message"> 该回复于2011-04-14 09:03:13被版主删除
---华软网友回复---
牛人太多了,受教了,谢谢。      
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。