澳门威尼斯人官网看c++引用 – bbqz007

持续澳门威尼斯人官网集合,本文应用VC2008对X86体系下C 正中鹄的援用停止了剖析。。

无论界限援用典型并将变量交换为援用典型?

援用比方针更承保。,这是真的吗?,不懂行情比方针更使遭受危险。。

为什么我应用常数援用?,只用于只读?

率先,让我来解说下面常常的单词。:

瞄准:缺陷OO正中鹄的瞄准。,它是指C 暗号正中鹄的若干典型(嵌入式)。,作文体,类围住,与变量的有意思的比得上。。

储藏处体: “the standard (草案) 3225, section []) which clearly states that a reference binds to storage and can outlive the object which existed when the reference was created:”,瞄准(或变量)的储藏处预防得分,通常是叫回。。

下面应用的变量名命名支配:

援用: 从R开端,后续典型缩写,如 float& rf。

方针: 从P开端,后续典型缩写,如 float* pf, const float* pcf, float* const pfc。

C 信号编译成汇编信号后,援用和方针异样是人家表明内存地址的储藏处体(通常是叫回。单元,或使尽能够奈何留下印象的应用,储藏处表明的内存地址)。

    uintptr_t uintptr = 0;
0041C7F6mov         dword ptr [uintptr],0  
    float flt = 0.f;
0041C7FDfldz0041C7FFfstp        dword ptr [FLT ]  
    float flt2 = 2.f;
0041C802fld         dword ptr ds:[426C64h]  
0041C808fstp        dword ptr [flt2]  
    float& rf = (float&)uintptr;
0041C80Blea         eax,[uintptr]  
0041C80Emov         dword ptr [无线电频率],eax  
    float* const pfc = &(float&)uintptr;
0041C81Flea         edx,[uintptr]  
0041C822mov         dword ptr [PFC ],edx

清楚的的是他们的接见方法。,最全部的分别是,介绍人接见紧接地接见被援用的税收(紧接地R),方针的接见是用税收储藏处器AD接见储藏处体。,对税收的接见必需不隐瞒的反援用。。

更确切地说,不克不及接见援用税收内存的内存。,除非你逼迫破解。。当应用评价官职的标志(=)给援用评价时,,汇编者率先援用反援用作为税收。,你仅有的给你援用的税收评价。。当方针不用于反向援用时,储藏处器被储藏处在税收储藏处器地址中。,更确切地说,你可以委派方针到单位方针和使适应定位。,无法更改援用单元评价的定位。。

    rf = 1.;
0041C837mov         eax,dword ptr [无线电频率]  
0041C83Afld10041C83Cfstp        dword ptr [EAX]  

相似地,当您想经过Sym援用住在牢房或小室中的地址时,你也不克不及这么做。,由于援用先于地址接见官职的标志。,回到被援用的税收。,更确切地说,接见介绍人税收的地址。。以下面的澳门威尼斯人官网来说,当您应用和RF接见地址时,,RF是介绍人瞄准。,您仅有的接见由RF援用的税收dWord。 ptr [无线电频率]”。除非你用汇编信号迫使LEA。 ?, [无线电频率]”,您可以获取用来储藏处介绍人税收的地址的地址。。

    float* pf = &rf;
0041C82Bmov         ecx,dword ptr [无线电频率]  
0041C82Emov         dword ptr [PF],ecx  
    void* pv = (void*)&pfc;
0041C831lea         edx,[PFC ]  
0041C834mov         dword ptr [光伏],edx  
    void* pv2;
    __asm {
        lea eax, [无线电频率];
0041C837lea         eax,[无线电频率]  
        mov dword ptr[pv2], eax;
0041C83Amov         dword ptr [pv2],eax  
    }

万一援用是被援用的税收的别号,和将变量交换为援用典型。,刚过去的变量是用于支持物税收的别号吗?

答案显然缺陷。。那会是什么呢?先自己去看澳门威尼斯人官网信号:

    rf = 1.;
0041C837mov         eax,dword ptr [无线电频率]  
0041C83Afld10041C83Cfstp        dword ptr [EAX]  
    (float&)rf = 2.;
0041C83Emov         ecx,dword ptr [无线电频率]  
0041C841fld         dword ptr ds:[426C64h]  
0041C847fstp        dword ptr [ECX]  
    (float&)uintptr = 3.;
0041C849fld         dword ptr ds:[426BC4h]  
    (float&)uintptr = 3.;
0041C84Ffstp        dword ptr [uintptr]  
    (int&)rf = 2;
0041C852mov         edx,dword ptr [无线电频率]  
0041C855mov         dword ptr [EDX],2  
    (int&)uintptr = 3;
0041C85Bmov         dword ptr [uintptr],3

注:浮点十进制数从漂储藏处单元到漂POIN的浮点十进制数,FSTP将浮点十进制留下印象0的浮点十进制数储藏处到。

将变量交换为援用典型,不将变量交换为单引号。,而缺陷将成批处理交换为变量援用。,援用典型接见。

UUNTPTR责备援用典型。,(浮点十进制和)UUTPTR交换为援用典型。,只因为UTIPTR缺少援用支持物的税收。,它用作缺少别号的介绍人税收。,或许UnTPTR内存单元曾经更改了对它的接见典型。,与*(浮点十进制*)和uTNPTR接见比得上。。而(float)uintptr则是按uintptr预告的典型有计算容量的它的内存单元的唱片,和交换唱片典型。。

竟至(漂和)无线电频率 = 2.;”,rf刚过去的援用率先反援用(在rf本人谈不上经过c++暗号接见到的方针单元,UITPTPR变量单元的地址。,反UTIPTR),其实质是使适应对介绍人税收的接见典型。,像,(INT&RF)无线电频率 = 2;”,不更改对RF援用的接见典型。,相反,更改对其援用的税收UItpTR的接见典型。。

说到这时,取缔援用文档。,这不难默认。。当你有人家叫RF的表示愿意时,你对刚过去的”rf”的接见(不管读写)特权市转变扭成对援用税收的接见(限在上级暗号层)。纵然要界限援用此援用的援用,它亦抵抗的的。。”float& rfx = 刚过去的句子。,RFX缺陷指RF。,相反,RF作为UUTPTR紧接地援用。,其实质是飘浮。 rfx = uintptr;”。万一你想援用人家叫做RF的介绍人,你必需先要能经过在c++暗号层增加名为rf的援用,它储藏处方针的储藏处单元地址。,这是谈不上的。,因而取缔援用文档。。

愚昧从何起方间遗留援用比方针更承保。。辩论如次。:

1. 当界限了援用时,必需对其停止设定初值。。

2. 援用将不会表明NULL。。

3. 介绍人点不克不及被修正。,除非当界限被界限时,它的定位才干被界限。。

1. 成绩是,说到底,程序员缺少设定初值VA。,这些程序员正中鹄的许多的不克不及使适应它们。。应用援用,汇编者逼迫他们设定初值。。由于由非设定初值使遭受的成绩不只仅是方针。。时而有程序员以为花时期写设定初值是在消耗时期,深深地的变量我必要人家人家地设定初值。,每个类深深地分子变量我还要人家人家设定初值,深深地类我还要人家人家为它们写几种确认重大聚会?!!我的税收是按需作曲逻辑,而缺陷写设定初值和确认D。。

2. 刚过去的成绩少量地荒唐。,自然,援用它的辩论自然缺陷空的。。

看一下下面的澳门威尼斯人官网信号:

    uintptr_t ptr = 0;
0041C8A6mov         dword ptr [ PTR ],0  
    float flt = 0.;
0041C8ADfldz0041C8AFfstp        dword ptr [FLT ]  
    float flt2 = 2.;
0041C8B2fld         dword ptr ds:[426C64h]  
    float flt2 = 2.;
0041C8B8fstp        dword ptr [flt2]  
    float& rf0 = (浮标0;
0041C8BBmov         dword ptr [rf0],0            ; 反向空地址,
    float& rf = *new 漂(FLT);
0041C8C2push40041C8C4call        operator new (040112Eh)  
0041C8C9add         esp,40041C8CCmov         dword ptr 电子准音器40h],eax  
0041C8CFcmp         dword ptr 电子准音器40h],00041C8D3je          block1+45h (041C8E5h)          ; 新分求出比值预防得分吗?
0041C8D5mov         eax,dword ptr 电子准音器40h]  
0041C8D8fld         dword ptr [FLT ]  
0041C8DBfstp        dword ptr [EAX]  
0041C8DDmov         ecx,dword ptr 电子准音器40h]  
0041C8E0mov         dword ptr 电子准音器48h],ecx  
0041C8E3jmp         block1+4Ch (041C8ECh)  
0041C8E5mov         dword ptr 电子准音器48h],0          ; 新忘记,援用名为空的援用。
0041C8ECmov         edx,dword ptr 电子准音器48h]  
0041C8EFmov         dword ptr [无线电频率],edx  

可以看出,介绍人是在设定初值时。,也会怎么不形势。,让它们表明空地址。。你并不克不及预防另一个应用方针反援用来对援用停止设定初值。竟,当应用方针时。,为了承保思索,本人常常写更多的方针判别。,只因为应用援用。,本人可以承保地基本原理它是承保的。。

另外,应用行情,本人也必需留意它与它私下的经济周期相干。。由于一旦援用被应用,让承保隐匿起来。,疏忽援用的税收的经济周期。。由于奈何 c++》提到的不要实验汇成重大聚会的地区变量的援用或重大聚会new浮现的瞄准的援用,两个实质是经济周期私下的相干成绩。你援用了人家进球。,刚过去的税收曾经被摧残了,超越了你的容量。。你援用了人家进球。,刚过去的税收的经济周期比你应用的长度要大。,你应当指导刚过去的税收的经济周期吗?。《effective C 提到,万一汇成瞄准援用的T,你必需亲自砍掉税收。,用这种方法很生疏的。。从行情的角度看,不舒服瞧不起税收的经济周期。,但其实质依然是方针。,方针在稍许的成绩。。

像,您作曲了人家模块。,模块正中鹄的类私下在援用相干。,这些援用在模块的经济周期相干中都是终止的。。但有朝一日,你必要重行应用其正中鹄的稍许的。,这些类的援用由mod超过的类实施交换。,或许有些类是缓存起来的。,经济周期越大。,援用私下的经济周期相干产生了兑换。,援用就像方针相等地。,它也可以表明人家奈何的住处附近的当地酒店的。。由于您应用单引号而缺陷方针。,你能够以为表示愿意将不会有成绩。,由于援用是承保的。。

3. 竟至援用,它不克不及经过暗号支配EXC来使适应它的定位。。当援用也可以被界限为表明null时,,它与方针恒量几乎缺少反差。。一向以为方针恒量不克不及界限为RE。,确保不为空的瞄准。,只因为援用NULL刚才人家假话。。因而方针恒量在稍许的成绩。,自然,表示愿意亦使得的。。刚才在援用工艺流程中应用。,您的税收接见被交换为人家值评价举动。,详述方针恒量时,汇编者将说误审。。但这并不克不及预防重要的人接见你的税收。,像,援用是作文或类的分子变量。。只需要误审,作文瞄准或类瞄准就缺陷支撑。,相似地,它是方针变量温柔的界限的分子变量。,异样的形势也会使适应。。

援用比方针更承保。,这刚才人家祝福。,祝福经过援用隐匿方针的应用,注意更承保。。但可能的选择援用在汇编层的实施执意方针,让援用交换方针,使规划更其承保。,那仅有的是个假话。。当每人都以为刚过去的慌言是真实的陈述的时分执意比应用方针更其坏的事实,信任援用比方针更承保。,用间歇管理异样的事实。。

C 书正议论援用相干的主旨。,更多的是它的传递重大聚会作为重大聚会。,与瞄准援用的匹敌。只需将瞄准参量更反倒援用参量那就够了。,可以经过接见瞄准接见瞄准。,在P的工艺流程中也可以戒除暂时瞄准的确认。,拿取许多的增加。或在过载类中汇成对举动符的援用。,这样使教室设计能不时地用于调解。。

说到尘世,本人必需说恒量的介绍人文档。,它指的是常数。。

率先,你不克不及应用丰盛的的行情。,界限它表明人家恒量。。,必需应用常数典型的援用。,界限它表明人家恒量。。。这么恒量会产生什么呢?,请看澳门威尼斯人官网信号:

    const float& rcf = 1.f;
00401181fld100401183fstp        dword ptr 电子准音器8]  
00401186lea         eax,电子准音器8]  
00401189mov         dword ptr [RCF],eax  
    const float& rcf2 = 1.f;
0040118Cfld10040118Efstp        dword ptr 电子准音器2Ch]  
00401191lea         ecx,电子准音器2Ch]  
00401194mov         dword ptr [rcf2],ecx  

您可以一下子看到汇编者悄悄地为常数分派了住处附近的当地酒店预防得分。,形如

constfloat implict = 1.f;    // dword ptr 电子准音器8]
constfloat& rcf = implict;
const flost implict2 = 1.f;    // dword ptr 电子准音器2Ch]
constfloat& rcf2 = implict2;

为什么援用参量不计划修正它的质地?,应用常数援用?让它只读一本。,次货,不克不及用恒量界限援用参量。。

void foo(float&);
void foo2(constfloat&);

main()
{
     foo (1.f); // error
     foo2(1.f);  // ok  
}

刚过去的重大聚会是健康状况如何承兑常数的?,界限常数介绍人参量?。请看澳门威尼斯人官网信号:

    foo2(1.f);
004011A3fld1004011A5fstp        dword ptr 电子准音器5Ch]  
004011A8lea         ecx,电子准音器5Ch]  
004011ABpush        ecx  
004011ACcall        foo2 (0401005h)  
004011B1add         esp,4

异样,汇编者为刚过去的恒量机密准备暂时变量预防得分。,将其赋给恒量。,并界限FO2的参量以表明此暂时变量。

也遵从的暂时类瞄准,评价给支持物变量,复制的此暂时类瞄准。,和对暂时类瞄准停止剖析。。只因为万一暂时类瞄准界限援用呢?

    B();
00401163lea         ecx,电子准音器59h]  
00401166callB::B (0401019h)  
0040116Blea         ecx,电子准音器59h]  
0040116EcallB::~B (0401028h)  
    A& ra = A();
00401173lea         ecx,电子准音器21h]  
00401176callA::A (040101Eh)  
0040117Blea         edx,电子准音器21h]  
0040117Emov         dword ptr [RA ],edx  
    C* const pcc = &C();
00401181lea         ecx,电子准音器5Ah]  
00401184callC::C (0401037h)  
00401189mov         dword ptr [PCC],eax  
0040118Clea         ecx,电子准音器5Ah]  
0040118FcallC::~C (040103Ch)  
    ...
    return 0;
004011C7mov         dword ptr 电子准音器64h],0004011CElea         ecx,电子准音器21h]  
004011D1callA::~A (0401023h)  
004011D6mov         eax,dword ptr 电子准音器64h]  
}
004011D9mov         esp,ebp  
004011DBpop         ebp  
004011DCret

住处附近的当地酒店暂时瞄准a())经济周期被扩展到LO的末了。,由于汇编者祝福确保此援用不造成。应用方针恒量将不会延伸暂时瞄准的经济周期。,C()的暂时瞄准界限方针常数PCC。,它紧接地被解构了。,丢了一根方针。。

在StAcExcel中也可以一下子看到异样的议论。

《Why is a c++ reference considered safer than a pointer?》

用联合收割机收割是你这么说的嘛!质地,你能发表下面的表明和产生了什么举动吗?

uintptr_t uintptr = 0;
float flt = 0.f;
float flt2 = 2.f;
float& rf = (float&)uintptr;
float& rf2 = (float&)uintptr = flt;
float& 氟化氢-3 = (float&)rf2 = flt2;
float*& rpf2 = (float*&)uintptr = &flt;

你说得对吗?,请商量澳门威尼斯人官网信号:

    float& rf2 = (float&)uintptr = flt;
00401138fld         dword ptr [FLT ]  
0040113Bfstp        dword ptr [uintptr]  
0040113Elea         eax,[uintptr]  
00401141mov         dword ptr [rf2],eax  
    float& 氟化氢-3 = (float&)rf2 = flt2;
00401144mov         ecx,dword ptr [rf2]  
00401147fld         dword ptr [flt2]  
0040114Afstp        dword ptr [ECX]  
0040114Cmov         edx,dword ptr [rf2]  
0040114Fmov         dword ptr [氟化氢-3],edx  
    float*& rpf2 = (float*&)uintptr = &flt;
00401152lea         eax,[FLT ]  
00401155mov         dword ptr [uintptr],eax  
00401158lea         ecx,[uintptr]  
0040115Bmov         dword ptr [rpf2],ecx 

屯积的澳门威尼斯人官网剖析集合有

《objc澳门威尼斯人官网剖析__strong和__weak》

Objc正中鹄的伪方针TraceDead方针

《澳门威尼斯人官网剖析NSString,你还叫回NSString吗?

《澳门威尼斯人官网剖析objc重大聚会枢纽objc_msgSend》

《objc澳门威尼斯人官网剖析,块重大聚会是什么?

《澳门威尼斯人官网objc剖析__block(典型)》

《便宜澳门威尼斯人官网逆命题剖析器 料斗反向输入的匹敌

《便宜澳门威尼斯人官网逆命题剖析器 迭代第六感觉版本 (一)》

《分子重大聚会方针,静态绑定(VC平台)

重大聚会方针和分子重大聚会方针私下的分别是什么?,澳门威尼斯人官网带了解分子重大聚会方针的本尊(gcc@x64平台)》

发表评论

电子邮件地址不会被公开。 必填项已用*标注