青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

大龍的博客

常用鏈接

統(tǒng)計

最新評論

關(guān)于NRV優(yōu)化

    在C++中,函數(shù)返回整數(shù)或指針是通過eax寄存器進行傳遞的,理解起來比較簡單。

    但是返回對象或結(jié)構(gòu)體一直是令人感到困惑的問題。今天我整理了一下,將整個返回過程寫下來,以作備用。

 

    還是先通過一個例子來理解這個問題:

首先,定義一個類Vector:

 

class Vector
{
public:
    int x,y;
};

 

然后定義函數(shù)add()對Vector對象進行操作:

Vector add(Vector& a, Vector & b)
{
    Vector v;
    v.x = a.x + b.x;
    v.y = a.y + b.y;
    return v;
}

 

現(xiàn)在的問題是:

如果調(diào)用如下語句:

Vector a, b;
Vector c = add(a, b);

請問從a, b傳入函數(shù)開始,一共創(chuàng)建了多少個對象?

 

在通常情況下我們會做出如下分析:

1. 在add()函數(shù)中創(chuàng)建對象v。

2. 函數(shù)返回,創(chuàng)建一個臨時變量__temp0,并將v的值拷貝到__temp0中。

3. 最后創(chuàng)建對象c,通過操作符=,將__temp0中的對象拷貝到c中。



 

但其實,我們會在后面看到,整個過程就只創(chuàng)建了1個對象:c。

 

為了更清晰的分析整個調(diào)用過程,我們?yōu)閂ector加上默認構(gòu)造函數(shù)和拷貝構(gòu)造函數(shù),并增加一個靜態(tài)變量count用于統(tǒng)計構(gòu)造函數(shù)調(diào)用次數(shù):

class Vector
{
public:
    static int count;

    static void init()
    {
        count = 0;
    }

    int x,y;

    Vector()
    {
        x = 0;
        y = 0;
        
        // For analysis.
        count ++;
        printf("Default Constructor was called.[0x%08x]\n", this);
    }

    Vector(const Vector & ref)
    {
        x = ref.x;
        y = ref.y;

        // For analysis.
        count ++;
        printf("Copy Constructor was called.[copy from 0x%08x to 0x%08x].\n", &ref, this);
    }

};

int Vector::count = 0;

 

然后在main()函數(shù)中寫上調(diào)用代碼:

    Vector a, b;
    Vector::init();
    printf("\n-- Test add() --\n");
    Vector c = add(a, b);
    printf("---- Constructors were called %d times. ----\n\n\n", Vector::count);

 

使用cl編譯。

(注:Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.40219.01 for 80x86, Microsoft (R) Incremental Linker Version 10.00.40219.01)

完成后,運行程序,得到如下結(jié)果:

-- Test add() --
Default Constructor was called.[0x0012fef8]
Copy Constructor was called.[copy from 0x0012fef8 to 0x0012ff60].
---- Constructors were called 2 times. ----

 

由此可知,在沒有優(yōu)化的情況下,整個調(diào)用過程共創(chuàng)建了兩個對象:

即:c和__temp0.

 

整個調(diào)用過程偽代碼如下:

首先add()函數(shù)被編譯器看做:

void add(Vector& __result, Vector& a, Vector & b)
{
    __result.x = a.x + b.x;
    __result.y = a.y + b.y;
    return;
}

而調(diào)用代碼同時被修改為:

    Vector a, b;
    Vector::init();
    printf("\n-- Test add() --\n");
    Vector __temp0;        // 構(gòu)造函數(shù).
    add(__temp0, a, b);
    Vector c(__temp0);    // 拷貝構(gòu)造函數(shù).
    printf("---- Constructors were called %d times. ----\n\n\n", Vector::count);

 



 

現(xiàn)在就可以理解輸出結(jié)果了吧。

這里要強調(diào)一點,看到”=”并不等于調(diào)用了Operator=()的代碼,以下三種情況其實是等效的,都只調(diào)用了拷貝構(gòu)造函數(shù):

Vector b(a);
Vector b = a;
Vector b = Vector(a);

 

最精彩的部分在于,如果你用

cl /Ox

 

編譯代碼,使優(yōu)化達到最大,再次運行,得到如下結(jié)果:

-- Test add() --
Default Constructor was called.[0x0012ff74]
---- Constructors were called 1 times. ----

 

這次,只調(diào)用了默認構(gòu)造函數(shù)。這樣的修改被稱作Named Return Value(NRV) Optimization。

什么是NRV優(yōu)化呢,顧名思義,就是保存返回值的變量不再使用沒名沒姓的__temp0這樣的東西了,而是直接把c作為返回變量,因此應(yīng)該將NRV翻譯為“有名字的返回變量”吧,侯捷翻譯的《深入探索C++對象模型》居然把它稱為“具名數(shù)值”,真是不知所云。

言歸正傳,NVR優(yōu)化的偽代碼如下:

    Vector c;
    add(c, a, b);

NVR優(yōu)化的最大好處就是不會再去調(diào)用那次多余拷貝構(gòu)造函數(shù)了(把__temp0拷貝到c),因此《深入探索C++對象模型》67頁最下面才會說第一版沒有拷貝構(gòu)造函數(shù),所以不能進行優(yōu)化。其實是指優(yōu)化的意義不大,或者說沒有什么可優(yōu)化的。



但是這樣帶來的壞處是,如果你在拷貝構(gòu)造函數(shù)里面放上與拷貝無關(guān)的代碼,比如我放入的printf和count++,那么這些東西就不會被調(diào)用了,產(chǎn)生優(yōu)化前后代碼不一致問題。所以大家要在此注意一下。
http://www.linuxso.com/linuxbiancheng/5726.html

posted on 2012-03-28 17:30 大龍 閱讀(458) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美风情在线观看| 黄色小说综合网站| 久久久水蜜桃av免费网站| 亚洲自拍偷拍福利| 欧美一级夜夜爽| 久久久久国产精品厨房| 欧美h视频在线| 欧美精品亚洲一区二区在线播放| 欧美日韩国产免费| 国产欧美日韩三区| 亚洲国产日韩欧美综合久久| 亚洲私拍自拍| 久久久久久香蕉网| 亚洲精品资源美女情侣酒店| 性感少妇一区| 欧美日韩国产精品一区二区亚洲| 国产精品私人影院| 亚洲精品免费网站| 久久精品成人| 亚洲精品资源美女情侣酒店| 久久aⅴ乱码一区二区三区| 欧美激情亚洲视频| 狠狠久久亚洲欧美专区| 正在播放亚洲| 免费在线一区二区| 亚洲天堂av在线免费观看| 噜噜噜在线观看免费视频日韩| 欧美区国产区| 亚洲成色www久久网站| 亚洲欧美日韩在线| 亚洲人成小说网站色在线| 亚洲欧美日韩精品久久久| 欧美高潮视频| 国精品一区二区三区| 亚洲综合三区| 亚洲乱码国产乱码精品精 | 久久久一本精品99久久精品66| 亚洲国产欧美日韩精品| 亚洲福利小视频| 麻豆精品视频在线| 国产精品扒开腿做爽爽爽软件| 在线成人激情视频| 欧美在线影院| 亚洲主播在线播放| 国产精品v欧美精品v日本精品动漫| 亚洲国产精品va在线看黑人| 久久九九精品| 香蕉成人啪国产精品视频综合网| 欧美日韩色一区| 999亚洲国产精| 亚洲国产成人在线视频| 免费日韩av电影| 亚洲国产高清在线| 欧美激情国产日韩| 欧美福利电影网| 亚洲乱码国产乱码精品精| 美女国产一区| 美脚丝袜一区二区三区在线观看 | 国产精品福利网站| 亚洲视频免费看| 亚洲视频精品| 国产日韩欧美视频在线| 久久精品官网| 久久久久久久久久久久久女国产乱 | 欧美不卡视频一区| 亚洲区一区二区三区| 亚洲欧洲视频| 欧美日韩在线观看一区二区三区| 亚洲视频精品在线| 亚洲影视综合| 激情综合电影网| 欧美激情第8页| 欧美日韩在线三区| 欧美一区三区三区高中清蜜桃| 亚洲欧美中文在线视频| 精品不卡一区二区三区| 亚洲国产老妈| 国产精品视频一区二区三区| 久久久欧美精品sm网站| 欧美激情精品久久久久久黑人| 亚洲一区黄色| 久久婷婷av| 亚洲欧美日韩视频一区| 久久久久久久一区二区| 一区二区三区久久| 欧美一区二区性| 亚洲精品美女在线观看| 亚洲综合第一| 亚洲理论在线| 久久av在线| 中日韩美女免费视频网址在线观看 | 久久国产精品久久久久久久久久| 欧美一二区视频| 亚洲破处大片| 亚洲欧美视频在线观看| 亚洲精品三级| 欧美在线视频免费| 中文在线不卡| 欧美成黄导航| 久久国产直播| 欧美午夜电影完整版| 免费高清在线视频一区·| 欧美日韩91| 牛牛国产精品| 国产夜色精品一区二区av| 亚洲美女视频| 亚洲国产精品毛片| 羞羞漫画18久久大片| 亚洲一区二区不卡免费| 欧美成人激情视频免费观看| 久久婷婷一区| 国产亚洲欧美一区二区三区| 99视频精品全部免费在线| 亚洲黄色成人| 久久精品五月| 久久亚洲欧美| 韩国成人理伦片免费播放| 亚洲午夜一二三区视频| 一区二区三区鲁丝不卡| 欧美福利一区二区| 欧美国产日韩xxxxx| 影音欧美亚洲| 久久久久久香蕉网| 久久综合一区| 亚洲大胆女人| 麻豆精品网站| 欧美国产综合| 亚洲国产精品精华液2区45| 久久久久99精品国产片| 久久综合久久综合久久| 国色天香一区二区| 久久久国产视频91| 蜜臀av一级做a爰片久久| 亚洲电影免费| 欧美福利视频一区| 亚洲精品视频一区二区三区| 在线一区亚洲| 国产精品久久久久9999吃药| 亚洲午夜精品久久久久久app| 亚洲影院色无极综合| 欧美午夜片欧美片在线观看| 亚洲特级毛片| 久久精品国产一区二区电影| 韩国欧美国产1区| 老鸭窝91久久精品色噜噜导演| 欧美成人在线网站| 一区二区三区欧美视频| 欧美视频在线观看| 亚洲高清在线观看| 亚洲精品四区| 欧美成人dvd在线视频| 欧美成人免费视频| 一区在线免费观看| 久久婷婷人人澡人人喊人人爽| 久久青草久久| 激情成人亚洲| 久久夜色精品一区| 蜜臀91精品一区二区三区| 亚洲福利视频一区二区| 欧美大片一区二区| 国产精品一级| 亚洲综合精品| 欧美在线观看天堂一区二区三区| 欧美香蕉大胸在线视频观看| 亚洲欧洲视频| 在线亚洲美日韩| 欧美视频在线免费看| 99国产精品| 亚洲午夜视频在线观看| 国产精品久久91| 久久精品一区四区| 亚洲私人影院在线观看| 欧美不卡三区| 欧美在线播放一区二区| 99视频热这里只有精品免费| 女人香蕉久久**毛片精品| 欧美在线视频播放| 在线国产亚洲欧美| 国产精品久久国产精麻豆99网站| 久久天天综合| 亚洲一级网站| 亚洲国产精品久久| 久久久亚洲欧洲日产国码αv | 一本色道久久综合一区 | 亚洲精品免费一区二区三区| 国产精品午夜在线| 欧美日韩国产区| 欧美成人黑人xx视频免费观看| 欧美一级久久久| 在线视频欧美日韩精品| 欧美高清在线精品一区| 欧美诱惑福利视频| 亚洲五月婷婷| 亚洲免费电影在线| 亚洲日韩欧美视频一区| 亚洲第一伊人| 极品裸体白嫩激情啪啪国产精品| 国产精品婷婷| 国产精品一二一区| 国产女人18毛片水18精品|