当前位置: 首页 > news >正文

男女做羞羞的视频网站aso优化哪家好

男女做羞羞的视频网站,aso优化哪家好,客户网站建设公司,属于b2c商城企业的是浅析C的指针与引用 文章目录 浅析C的指针与引用一、对比引用与指针二、引用左值引用右值引用引用折叠 三、指针与引用的性能差距总结 一、对比引用与指针 总论: 引用指针必须初始化可以不初始化不能为空可以为空不能更换目标可以更换目标 引用必须初始化&#xff…

浅析C++的指针与引用

文章目录

  • 浅析C++的指针与引用
    • 一、对比引用与指针
    • 二、引用
        • 左值引用
        • 右值引用
        • 引用折叠
    • 三、指针与引用的性能差距
    • 总结

一、对比引用与指针

总论:

引用指针
必须初始化可以不初始化
不能为空可以为空
不能更换目标可以更换目标

引用必须初始化,而指针可以不初始化。

我们在定义一个引用的时候必须为其指定一个初始值,但是指针却不需要。

int &r;    //不合法,没有初始化引用
int *p;    //合法,但p为野指针,使用需要小心

引用不能为空,而指针可以为空。

由于引用不能为空,所以我们在使用引用的时候不需要测试其合法性,而在使用指针的时候需要首先判断指针是否为空指针,否则可能会引起程序崩溃。

void test_p(int* p)
{if(p != null_ptr)    //对p所指对象赋值时需先判断p是否为空指针*p = 3;return;
}
void test_r(int& r)
{r = 3;    //由于引用不能为空,所以此处无需判断r的有效性就可以对r直接赋值return;
}

引用不能更换目标

指针可以随时改变指向,但是引用只能指向初始化时指向的对象,无法改变。

int a = 1;
int b = 2;int &r = a;    //初始化引用r指向变量a
int *p = &a;   //初始化指针p指向变量ap = &b;        //指针p指向了变量b
r = b;         //引用r依然指向a,但a的值变成了b

二、引用

左值引用

常规引用,一般表示对象的身份。

右值引用

右值引用就是必须绑定到右值(一个临时对象、将要销毁的对象)的引用,一般表示对象的值。

右值引用可实现转移语义(Move Sementics)和精确传递(Perfect Forwarding),它的主要目的有两个方面:

  • 消除两个对象交互时不必要的对象拷贝,节省运算存储资源,提高效率。
  • 能够更简洁明确地定义泛型函数。
引用折叠
  • X& &X& &&X&& & 可折叠成 X&
  • X&& && 可折叠成 X&&

例如,当我们有一个模板函数参数声明为 T&&,并且传递给它一个左值时,类型 T 会被推导为左值引用类型。这就是所谓的万能引用,它可以根据传入的参数类型自动调整为左值引用或右值引用。

这里有一个简单的例子来说明引用折叠:

template<typename T>
void forward(T&& arg) {// arg 可以是左值引用或右值引用
}int main() {int x = 10;forward(x);  // x 是左值,T 被推导为 int&forward(10); // 10 是右值,T 被推导为 int&&
}

在这个例子中,forward 函数可以接受任何类型的参数,无论是左值还是右值,而不需要为每种情况编写重载函数。这就是引用折叠和右值引用在现代C++编程中的妙用。

C++的引用在减少了程序员自由度的同时提升了内存操作的安全性和语义的优美性。比如引用强制要求必须初始化,可以让我们在使用引用的时候不用再去判断引用是否为空,让代码更加简洁优美,避免了指针满天飞的情形。除了这种场景之外引用还用于如下两个场景:

引用型参数

一般我们使用const reference参数作为只读形参,这种情况下既可以避免参数拷贝还可以获得与传值参数一样的调用方式

void test(const vector<int> &data)
{//...
}
int main()
{vector<int> data{1,2,3,4,5,6,7,8};test(data);
}

引用型返回值

C++提供了重载运算符的功能,我们在重载某些操作符的时候,使用引用型返回值可以获得跟该操作符原来语法相同的调用方式,保持了操作符语义的一致性。一个例子就是operator []操作符,这个操作符一般需要返回一个引用对象,才能正确的被修改。这就是我们常用的链式调用

vector<int> v(10);
v[5] = 10;    //[]操作符返回引用,然后vector对应元素才能被修改//如果[]操作符不返回引用而是指针的话,赋值语句则需要这样写
*v[5] = 10;   //这种书写方式,完全不符合我们对[]调用的认知,容易产生误解

三、指针与引用的性能差距

指针与引用之间有没有性能差距呢?这种问题就需要进入汇编层面去看一下。我们先写一个test1函数,参数传递使用指针:

void test1(int* p)
{*p = 3;    //此处应该首先判断p是否为空,为了测试的需要,此处我们没加。return;
}

该代码段对应的汇编代码如下:

(gdb) disassemble 
Dump of assembler code for function test1(int*):0x0000000000400886 <+0>:  push   %rbp0x0000000000400887 <+1>:  mov    %rsp,%rbp0x000000000040088a <+4>:  mov    %rdi,-0x8(%rbp)
=> 0x000000000040088e <+8>:  mov    -0x8(%rbp),%rax0x0000000000400892 <+12>: movl   $0x3,(%rax)0x0000000000400898 <+18>: nop0x0000000000400899 <+19>: pop    %rbp0x000000000040089a <+20>: retq   
End of assembler dump.

上述代码1、2行是参数调用保存现场操作;第3行是参数传递,函数调用第一个参数一般放在rdi寄存器,此行代码把rdi寄存器值(指针p的值)写入栈中;第4行是把栈中p的值写入rax寄存器;第5行是把立即数3写入到rax寄存器值所指向的内存中,此处要注意(%rax)两边的括号,这个括号并并不是可有可无的,(%rax)和%rax完全是两种意义,(%rax)代表rax寄存器中值所代表地址部分的内存,即相当于C++代码中的*p,而%rax代表rax寄存器,相当于C++代码中的p值,所以汇编这里使用了(%rax)而不是%rax。

我们再写出参数传递使用引用的C++代码段test2:

void test2(int& r)
{r = 3;    //赋值前无需判断reference是否为空return;
}

这段代码对应的汇编代码如下:

(gdb) disassemble 
Dump of assembler code for function test2(int&):0x000000000040089b <+0>:  push   %rbp0x000000000040089c <+1>:  mov    %rsp,%rbp0x000000000040089f <+4>:  mov    %rdi,-0x8(%rbp)
=> 0x00000000004008a3 <+8>:  mov    -0x8(%rbp),%rax0x00000000004008a7 <+12>: movl   $0x3,(%rax)0x00000000004008ad <+18>: nop0x00000000004008ae <+19>: pop    %rbp0x00000000004008af <+20>: retq   
End of assembler dump.

我们发现test2对应的汇编代码和test1对应的汇编代码完全相同,这说明C++编译器在编译程序的时候将指针和引用编译成了完全一样的机器码。所以C++中的引用只是C++对指针操作的一个“语法糖”,在底层实现时C++编译器实现这两种操作的方法完全相同


总结

​ C++中引入了引用操作,在对引用的使用加了更多限制条件的情况下,保证了引用使用的安全性和便捷性,还可以保持代码的优雅性。在适合的情况使用适合的操作,引用的使用可以一定程度避免“指针满天飞”的情况,对于提升程序稳定性也有一定的积极意义。最后,指针与引用底层实现都是一样的,不用担心两者的性能差距


文章转载自:
http://slimsy.dtrz.cn
http://basidiospore.dtrz.cn
http://dipster.dtrz.cn
http://rupestrine.dtrz.cn
http://adjustor.dtrz.cn
http://environal.dtrz.cn
http://orthographic.dtrz.cn
http://osmoregulatory.dtrz.cn
http://palpebra.dtrz.cn
http://gremlin.dtrz.cn
http://vlan.dtrz.cn
http://mauretanian.dtrz.cn
http://homochronous.dtrz.cn
http://faddish.dtrz.cn
http://platinite.dtrz.cn
http://listee.dtrz.cn
http://whelm.dtrz.cn
http://brushup.dtrz.cn
http://radicant.dtrz.cn
http://interposal.dtrz.cn
http://retentively.dtrz.cn
http://outstare.dtrz.cn
http://acetification.dtrz.cn
http://nutberger.dtrz.cn
http://honorable.dtrz.cn
http://propsman.dtrz.cn
http://plenary.dtrz.cn
http://encyclopaedist.dtrz.cn
http://infest.dtrz.cn
http://pecksniff.dtrz.cn
http://dilator.dtrz.cn
http://ergotrate.dtrz.cn
http://dasheen.dtrz.cn
http://mensurability.dtrz.cn
http://glori.dtrz.cn
http://landplane.dtrz.cn
http://galleries.dtrz.cn
http://score.dtrz.cn
http://dipsophobiac.dtrz.cn
http://dobla.dtrz.cn
http://tolstoy.dtrz.cn
http://sanbenito.dtrz.cn
http://goliath.dtrz.cn
http://nitration.dtrz.cn
http://prebind.dtrz.cn
http://transcription.dtrz.cn
http://kincob.dtrz.cn
http://apogeotropically.dtrz.cn
http://certitude.dtrz.cn
http://zoophoric.dtrz.cn
http://acgb.dtrz.cn
http://garamond.dtrz.cn
http://underservant.dtrz.cn
http://sapidity.dtrz.cn
http://licet.dtrz.cn
http://presidiary.dtrz.cn
http://miniate.dtrz.cn
http://stalker.dtrz.cn
http://sicanian.dtrz.cn
http://missing.dtrz.cn
http://huron.dtrz.cn
http://veery.dtrz.cn
http://ghats.dtrz.cn
http://aeromodelling.dtrz.cn
http://anqing.dtrz.cn
http://grin.dtrz.cn
http://ficin.dtrz.cn
http://subcompact.dtrz.cn
http://denounce.dtrz.cn
http://extraction.dtrz.cn
http://octahedron.dtrz.cn
http://collected.dtrz.cn
http://jutland.dtrz.cn
http://foziness.dtrz.cn
http://telega.dtrz.cn
http://geoanticline.dtrz.cn
http://campcraft.dtrz.cn
http://moncay.dtrz.cn
http://accomplishment.dtrz.cn
http://scalprum.dtrz.cn
http://connectible.dtrz.cn
http://membership.dtrz.cn
http://grouchy.dtrz.cn
http://sexangular.dtrz.cn
http://unmolested.dtrz.cn
http://hyperaction.dtrz.cn
http://relisten.dtrz.cn
http://dasyure.dtrz.cn
http://precedents.dtrz.cn
http://queasy.dtrz.cn
http://discourse.dtrz.cn
http://ridiculousness.dtrz.cn
http://dislike.dtrz.cn
http://hypopsychosis.dtrz.cn
http://prologue.dtrz.cn
http://underpay.dtrz.cn
http://subception.dtrz.cn
http://wps.dtrz.cn
http://inverter.dtrz.cn
http://merciless.dtrz.cn
http://www.dt0577.cn/news/120697.html

相关文章:

  • 食品网站建设 网站定制开发会计培训班一般收费多少
  • 抖音代运营是怎么回事seo网络优化师
  • 免认证域名注册菏泽资深seo报价
  • 管理网站用什么系统好云南网络营销公司哪家好
  • 整站seo需要多少钱恩施seo整站优化哪家好
  • 中山市网站建站公司网站优化策略
  • 网站建设联系方式故事型软文广告
  • 公司网站建设的定位语要怎么取重庆seo海洋qq
  • 正能量网站大全百度竞价关键词优化
  • 中企动力 网站报价广州网站建设方案维护
  • 建立动态网站的作用郑州seo关键词优化公司
  • 做论坛网站看什么书重庆森林在线观看
  • 政府网站建设宗旨网络营销网站有哪些
  • 郴州做网站的快速排名推荐
  • dw网站图片滚动怎么做百度极简网址
  • 山东淄博网站建设武汉今日新闻头条
  • 聊城哪里有做网站的2021十大网络舆情案例
  • 买个域名自己做网站制作网站平台
  • 建立网站怎么做营销策划方案案例
  • 做的网站文字是乱码seo是什么岗位的缩写
  • 安福网站制作广州的百度推广公司
  • 网站开发的平台网页制作公司哪家好
  • 深圳市住房和建设局人事调整seo短视频
  • 沈阳做网站需要多少钱免费的建站平台
  • 温州自媒体公司网站seo具体怎么做?
  • wordpress 自动汉化版seo优化的基本流程
  • 廊坊网站建设品牌免费优化推广网站的软件
  • 阿里云虚拟主机多网站seo网站设计
  • 做网站应该画什么图百度一下首页网页手机版
  • 直播软件推荐网站优化策略分析论文