指针与引用的性能比较

我们先来看一下传指针与传引用的效率方面的对比吧

  • 本质上来说了,传引用是一个变量的别名而已。并没有开辟新的空间。而指针了是指向一个空间对应一个空间的地址
  • 好吧,我们分别通过两者效率,和本质方面看一下两者之间的区别吧。
    -首先看一下两者的效率
    看代码

#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;
}

在这里插入图片描述
其实了,可以发现引用就是一个别名,没有独立的空间,何其引用实体共用同一块内存空间,但是底层了实际上是有空间的,引用是按照指针方式来实现的

  • 总结一下
  • 引用和指针的不同点:
    1. 引用在定义时必须初始化,指针没有要求
    1. 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型 实体
    1. 没有NULL引用,但有NULL指针
    1. 在sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占 4个字节)
    1. 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大小
    1. 有多级指针,但是没有多级引用
    1. 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
    1. 引用比指针使用起来相对更

猜你喜欢

转载自blog.csdn.net/sing_Hwang/article/details/85725839