我们先来看一下传指针与传引用的效率方面的对比吧
- 本质上来说了,传引用是一个变量的别名而已。并没有开辟新的空间。而指针了是指向一个空间对应一个空间的地址
- 好吧,我们分别通过两者效率,和本质方面看一下两者之间的区别吧。
-首先看一下两者的效率
看代码
#include<iostream>
#include<time.h>
using namespace std;
//memcpy浅拷贝
//typeid
struct A {
int a[10000];
};
void TestFunc1(A a) {}
void TestFunc2(A& a) {}
void TestRefAndValue() {
A a;
// 以指针作为函数参数
size_t begin1 = clock();
for (size_t i = 0; i < 10000; ++i)
TestFunc1(a);
size_t end1 = clock();
// 以引用作为函数参数
size_t begin2 = clock();
for (size_t i = 0; i < 10000; ++i)
TestFunc2(a);
size_t end2 = clock();
cout << "TestFunc1(int*)-time:" << end1 - begin1 << endl;
cout << "TestFunc2(int&)-time:" << end2 - begin2 << endl;
}
// 运行多次,检测指针和引用在传参方面的效率区别
int main() { for (int i = 0; i < 10; ++i)
{
TestRefAndValue();
}
return 0;
}
传引用还是要快一些啊!!!
传值传指针还是有一点区别的啊
- 在来看一下他们调用过程中的汇编代码
int main()
{
int a = 10;
int& ra = a;
ra = 20;
int* pa = &a;
*pa = 20;
return 0;
}
其实了,可以发现引用就是一个别名,没有独立的空间,何其引用实体共用同一块内存空间,但是底层了实际上是有空间的,引用是按照指针方式来实现的
- 总结一下
- 引用和指针的不同点:
-
- 引用在定义时必须初始化,指针没有要求
-
- 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型 实体
-
- 没有NULL引用,但有NULL指针
-
- 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占 4个字节)
-
- 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
-
- 有多级指针,但是没有多级引用
-
- 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
-
- 引用比指针使用起来相对更