实战篇 | 21 C++ 多线程与资源竞争问题

本文深入探讨C++中的多线程和资源竞争问题,讲解了C++指针与引用的区别,强调了引用作为内存别名的特点,并讨论了在不同场景下使用指针和引用的原因。此外,还介绍了如何在C++14中实现多线程,以及如何利用条件量解决资源竞争问题。
摘要由CSDN通过智能技术生成

小知识:C++指针与引用的区别

对C++当中的指针和引用,用时还是分不清,C++里面为什么要有这两种概念呢,分为能解决什么样的问题呢,类比来看呢,Java或C#这样的高级编程语言里面,为什么没有出现指针这个东西呢,只有引用这个概念?

我们来看一个例子

Java当中传递是引用,指向的都是同一个对象,所以,o.getName()得到的是Samuel。

在C++中,因为参数传递的不是引用,而是拷贝,所以o.getName()的结果是空。

如果我们希望也像Java当中,拿到我们修改的东西,我们需要在参数前面加一个取地址符号&,变成引用,这样本质上指向的是原本对象,而不是拷贝出来的对象。这种情况下我们用到了引用。

那引用和指针的区别又在哪里呢?

前面我们把引用当作内存当中的首地址,它是一个别名。

但是指针,我们要把Obj 看成是一个完整的一个整体。我们要把指针看成一个类型。所以这里,这个o是Obj 类型,它是指针类型。我们在前面讲C++的时候讲到过一个比较重要的概念,就是那几种类型转换:dynamic_cast(RTTI),static_cast,强制转换(reinterpret_cast),cost_cast.

我们现在看reinterpret_cast,它可以把C++任何一种类型转换成我想要的类型。不管转换出来的东西有没有用,反正都能转。所以大家要注意,指针本质上是一个长度为4字节的内存区域。它里面存的是一串数字,如:0x0000FDE1,那这串数字又是什么,是不是地址,存储的内存地址。我们通常讲的int32_t,也是4个字节,我们现在用reinterpret_cast把这个.o转换成int32_t.我们发现它本质上就是一串数字。那这串数字是什么东西呢,它指向一块特定内存区域,那块内存区域的首地址,它指向的是内存当中的另外一个地方。

所以,大家可以看到引用和指针的区别在哪里?

int i = 100;
引用的写法:&i,拿到的是100的地址;
而我们想把这个地址存起来,我们用:
int* iPtr = &i;
这里我们可以看到,引用是一个值,而指针是一个变量

我们为什么要在C++当中去区分指针和引用?

关键,归根结底我们希望灵活。我们希望通过指针和引用来实现不同的功能或者场景。 大家考虑一下我们刚刚前面的例子,我在参数前面写了一个&,这个场景是非常管用的。我只是用别名 .o,我没有创建指针,我直接去操纵别名的。那如果我创建指针会有什么用呢。

假如,机器学习中,我们需要导入大量图片去做训练,那这些图片放在内存里面我怎么取管理它呢,每一张图片需要一块内存去存储它,前面文章谈卷积神经网络的时候,我们是不是把位图比作一个矩阵,通过数字来定义的这样一个矩阵,每个图片image是一个矩阵,所以会有无数个矩阵,我们放在C&

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值