真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

C++11中的std::addressof怎么用

本文小編為大家詳細(xì)介紹“C++11中的std::addressof怎么用”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“C++11中的std::addressof怎么用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學(xué)習(xí)新知識(shí)吧。

貢覺網(wǎng)站制作公司哪家好,找成都創(chuàng)新互聯(lián)公司!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)公司等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。成都創(chuàng)新互聯(lián)公司2013年開創(chuàng)至今到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選成都創(chuàng)新互聯(lián)公司。

1、源碼準(zhǔn)備

本文是基于gcc-4.9.0的源代碼進(jìn)行分析,std::addressof是C++11才加入標(biāo)準(zhǔn)的,所以低版本的gcc源碼是沒有這個(gè)的,建議選擇4.9.0或更新的版本去學(xué)習(xí),不同版本的gcc源碼差異應(yīng)該不小,但是原理和設(shè)計(jì)思想的一樣的。

2、std::addressof簡介

std::addressof的作用是獲取一個(gè)對(duì)象的實(shí)際地址,即使這個(gè)對(duì)象的&操作符已被重載。它接受一個(gè)參數(shù),該參數(shù)為要獲得地址的那個(gè)對(duì)象的引用。下面通過一個(gè)極其簡單的例子了解一下std::addressof的使用方法

#include 
#include 
#include 

class Test
{
public:
    int* operator&()
    {
        return &b;
    }

    int* a_addr()
    {
        return &a;
    }

    int* b_addr()
    {
        return &b;
    }

private:
    int a;
    int b;
};

int main(int argc, char* argv[])
{
    Test t;
    std::cout << "&t.a:" << t.a_addr() << std::endl;
    std::cout << "&t.b:" << t.b_addr() << std::endl;
    std::cout << "&t:" << &t << std::endl;
    std::cout << "addressof(t):" << std::addressof(t) << std::endl;
}

上面的代碼輸出結(jié)果為:

&t.a:0x7ffefcb48eb0
&t.b:0x7ffefcb48eb4
&t:0x7ffefcb48eb4
addressof(t):0x7ffefcb48eb0

在這里正常來說使用&t應(yīng)該取到的是t.a的地址值才對(duì),但是由于我們重載了&運(yùn)算符,所以這里取到了t.b的地址值,但是如果使用了std::addressof,就可以取到正確的值了。

3、std::addressof源碼解析

std::addressof位于libstdc++-v3\include\bits\move.h中

template
inline _Tp* __addressof(_Tp& __r) _GLIBCXX_NOEXCEPT
{
    return reinterpret_cast<_Tp*>(&const_cast(reinterpret_cast(__r)));
}

template
inline _Tp* addressof(_Tp& __r) noexcept
{ return std::__addressof(__r); }

從代碼中可以看出std::addressof里面調(diào)用了std::__addressof,所以真正起作用的是std::__addressof。__addressof的處理過程可以分為以下四步:

  • 將__r由類型_Tp&強(qiáng)制轉(zhuǎn)換為const volatile char&,這樣做有兩個(gè)作用:一是防止后面使用&操作符獲取地址時(shí)觸發(fā)原類型(即_Tp)的重載操作(operator&),就像上面那個(gè)例子那樣;二是reinterpret_cast操作符總是可以合法的在原類型的基礎(chǔ)上加const或volatile, 但是如果_Tp原來就帶有const或volatile的話, 通過reinterpret_cast去掉是不允許的, 因此需要加上const volatile來避免編譯器報(bào)錯(cuò), 也就是此時(shí)不用再管_Tp是否本來就帶有const或volatile屬性了。

  • 將前面轉(zhuǎn)換得到的結(jié)果強(qiáng)制轉(zhuǎn)換為char&類型,此時(shí)如果轉(zhuǎn)換成其它類型有可能會(huì)觸發(fā)強(qiáng)制地址對(duì)齊的操作,這樣的話真實(shí)地址就有可能會(huì)被改變了,最終造成程序錯(cuò)誤。需要注意的是這個(gè)轉(zhuǎn)換過程使用的是const_cast,可以順便將前面留下的const和volatile屬性給去掉了。

  • 使用&符號(hào)將前面的結(jié)果的地址給取出來(此時(shí)已經(jīng)不會(huì)觸發(fā)重載了)

  • 最后一步使用reinterpret_cast將前面獲取到的地址轉(zhuǎn)換回_Tp*類型,并且此時(shí)也會(huì)保留_Tp的const或volatile屬性(如果有的話)

讀到這里,這篇“C++11中的std::addressof怎么用”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


當(dāng)前題目:C++11中的std::addressof怎么用
轉(zhuǎn)載來源:http://weahome.cn/article/gsipph.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部