指针与引用的性能比较

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

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

#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. 引用比指针使用起来相对更
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 引用指针都是 C 语言中用于处理变量地址的概念,但它们有一些区别。引用是一个变量的别名,它与原变量共享同一个地址,可以直接访问原变量的值,而不需要使用解引用操作符。指针是一个变量,它存储了另一个变量的地址,需要使用解引用操作符才能访问原变量的值。此外,引用在定义时必须初始化,而指针可以先定义再初始化。 ### 回答2: 引用(Reference)和指针(Pointer)是C++中两种不同的方式来访问内存中的数据。 首先,从语法角度来说,引用是在定义时直接与已存在的变量进行关联,而且一旦关联了某个变量,就不能再改变关联对象。指针则是变量,用来存储某个变量的内存地址,可以通过改变指针的值来指向不同的对象。 其次,从使用方式来说,引用使用起来更加简洁和直观。我们可以通过引用直接使用被关联变量的值,并且不需要使用解引用操作符。指针则需要使用解引用操作符来获取被指向对象的值。 再次,从安全性角度来说,引用相对指针更加安全。因为引用在定义时必须与已存在的变量进行关联,而且不能关联空值,所以不存在空指针的问题。指针则可能存在空指针的情况,使用时需要进行判空操作,以防止程序崩溃或发生未定义的行为。 最后,从底层机制来说,引用在编译器层面就进行了地址的运算,所以引用性能开销更小。指针在使用时需要进行取地址和解引用的操作,相对而言开销更大。 综上所述,引用指针在语法、使用方式、安全性和底层机制上都有一些区别。在实际开发中,我们可以根据具体需求选择使用引用或者指针。 ### 回答3: 引用指针在C++中都用于访问和操作内存中的数据,但它们之间有一些重要的区别。 1. 定义方式:引用是在声明时使用&符号来定义的,例如int& ref = num;而指针是通过在声明时使用*符号来定义的,例如int* ptr = &num;引用必须在声明时进行初始化,而指针可以在后续的代码中进行初始化或者改变所指向的对象。 2. 空值:指针可以被设置为NULL,表示不指向任何有效的内存地址。而引用必须指向一个已经存在的对象,引用本身不会成为一个空值。 3. 内存管理:指针可以通过使用new和delete关键字进行动态内存的分配和释放,从而允许动态地创建和销毁对象。而引用必须在创建时就指向一个已经存在的对象,并且不能通过引用来动态地创建或销毁对象。 4. 操作方式:引用在使用时不需要进行解引用操作,即可以直接对引用进行操作,编译器会自动将引用指向的对象进行解引用。而指针需要通过解引用操作符*来访问指针指向的内存。 5. 常量:指针可以被声明为const,表示指针本身是一个常量,而引用不能被声明为const,因为引用本身已经是一个常量。 总的来说,引用指针都可以用于操作和访问内存中的数据,但引用更简洁、更安全,而指针更灵活、更复杂。使用时需要根据具体的需求和场景来选择合适的方式。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值