国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - 詳解C++編譯器優(yōu)化技術

詳解C++編譯器優(yōu)化技術

2021-11-12 16:01可可西 C/C++

現代編譯器缺省會使用RVO(return value optimization,返回值優(yōu)化)、NRVO(named return value optimization、命名返回值優(yōu)化)和復制省略(Copy elision)技術,來減少拷貝次數來提升代碼的運行效率。

前言

注1:vc6、vs沒有提供編譯選項來關閉該優(yōu)化,無論是debug還是release都會進行RVO和復制省略優(yōu)化

注2:vc6、vs2005以下及vs2005+ Debug上不支持NRVO優(yōu)化,vs2005+ Release支持NRVO優(yōu)化

注3:g++支持這三種優(yōu)化,并且可通過編譯選項:-fno-elide-constructors來關閉優(yōu)化

RVO

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <stdio.h>
class A
{
public:
    A()
    {
        printf("%p construct\n", this);
    }
    A(const A& cp)
    {
        printf("%p copy construct\n", this);
    }
    ~A()
    {
        printf("%p destruct\n", this);
    }
};
 
A GetA()
{
    return A();
}
 
int main()
{
    {
        A a = GetA();
    }
 
    return 0;
}

在g++和vc6、vs中,上述代碼僅僅只會調用一次構造函數和析構函數 ,輸出結果如下:

0x7ffe9d1edd0f construct

0x7ffe9d1edd0f destruct

在g++中,加上-fno-elide-constructors選項關閉優(yōu)化后,輸出結果如下:

0x7ffc46947d4f construct  // 在函數GetA中,調用無參構造函數A()構造出一個臨時變量temp

0x7ffc46947d7f copy construct // 函數GetA return語句處,把臨時變量temp做為參數傳入并調用拷貝構造函數A(const A& cp)將返回值ret構造出來

0x7ffc46947d4f destruct // 函數GetA執(zhí)行完return語句后,臨時變量temp生命周期結束,調用其析構函數~A()

0x7ffc46947d7e copy construct // 函數GetA調用結束,返回上層main函數后,把返回值變量ret做為參數傳入并調用拷貝構造函數A(const A& cp)將變量A a構造出來

0x7ffc46947d7f destruct // A a = GetA()語句結束后,返回值ret生命周期結束,調用其析構函數~A()

0x7ffc46947d7e destruct // A a要離開作用域,生命周期結束,調用其析構函數~A()

注:臨時變量temp、返回值ret均為匿名變量

下面用c++代碼模擬一下其優(yōu)化行為:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <new>
A& GetA(void* p)
{
    //由于p的內存是從外部傳入的,函數返回后仍然有效,因此返回值可為A&
    //vs中,以下代碼還可以寫成:
    // A& o = *((A*)p);
    // o.A::A();
    // return o;
    return *new (p) A(); // placement new
}
 
int main()
{
    {
        char buf[sizeof(A)];
        A& a = GetA(buf);
        a.~A();
    }
 
    return 0;
}

NRVO

g++編譯器、vs2005+ Release(開啟/O2及以上優(yōu)化開關)

修改上述代碼,將GetA的實現修改成:

?
1
2
3
4
5
A GetA()
{
    A o;
    return o;
}

在g++、vs2005+ Release中,上述代碼也僅僅只會調用一次構造函數和析構函數 ,輸出結果如下:

0x7ffe9d1edd0f construct

0x7ffe9d1edd0f destruct

g++加上-fno-elide-constructors選項關閉優(yōu)化后,和上述結果一樣

0x7ffc46947d4f construct

0x7ffc46947d7f copy construct

0x7ffc46947d4f destruct

0x7ffc46947d7e copy construct

0x7ffc46947d7f destruct

0x7ffc46947d7e destruct

但在vc6、vs2005以下、vs2005+ Debug中,沒有進行NRVO優(yōu)化,輸出結果為:

18fec4 construct  // 在函數GetA中,調用無參構造函數A()構造出一個臨時變量o

18ff44 copy construct  // 函數GetA return語句處,把臨時變量o做為參數傳入并調用拷貝構造函數A(const A& cp)將返回值ret構造出來

18fec4 destruct  // 函數GetA執(zhí)行完return語句后,臨時變量o生命周期結束,調用其析構函數~A()

18ff44 destruct // A a要離開作用域,生命周期結束,調用其析構函數~A()

下面用c++代碼模擬一下vc6、vs2005以下、vs2005+ Debug上的行為:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <new>
A& GetA(void* p)
{
    A o;
    //由于p的內存是從外部傳入的,函數返回后仍然有效,因此返回值可為A&
    //vs中,以下代碼還可以寫成:
    // A& t = *((A*)p);
    // t.A::A(o);
    // return t;
    return *new (p) A(o); // placement new
}
 
int main()
{
    {
        char buf[sizeof(A)];
        A& a = GetA(buf);
        a.~A();
    }
 
    return 0;
}

注:與g++、vs2005+ Release相比,vc6、vs2005以下、vs2005+ Debug只優(yōu)化掉了返回值到變量a的拷貝,命名局部變量o沒有被優(yōu)化掉,所以最后一共有2次構造和析構的調用

復制省略

典型情況是:調用構造函數進行值類型傳參

?
1
2
3
4
5
6
7
8
9
10
11
12
void Func(A a)
{
}
 
int main()
{
    {
        Func(A());
    }
 
    return 0;
}

在g++和vc6、vs中,上述代碼僅僅只會調用一次構造函數和析構函數 ,輸出結果如下:

0x7ffeb5148d0f construct

0x7ffeb5148d0f destruct

在g++中,加上-fno-elide-constructors選項關閉優(yōu)化后,輸出結果如下:

0x7ffc53c141ef construct   // 在main函數中,調用無參構造函數構造實參變量o

0x7ffc53c141ee copy construct // 調用Func函數后,將實參變量o做為參數傳入并調用拷貝構造函數A(const A& cp)將形參變量a構造出來

0x7ffc53c141ee destruct // 函數Func執(zhí)行完后,形參變量a生命周期結束,調用其析構函數~A()

0x7ffc53c141ef destruct // 返回main函數后,實參變量o要離開作用域,生命周期結束,調用其析構函數~A()

下面用c++代碼模擬一下其優(yōu)化行為:

?
1
2
3
4
5
6
7
8
9
10
11
12
void Func(const A& a)
{
}
 
int main()
{
    {
        Func(A());
    }
 
    return 0;
}

優(yōu)化失效的情況

開啟g++優(yōu)化,得到以下各種失效情況的輸出結果:

(1)根據不同的條件分支,返回不同變量

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
A GetA(bool bflag)
{
    A a1, a2;
    if (bflag)
        return a1;
    return a2;
}
 
int main()
{
    A a = GetA(true);
 
    return 0;
}

0x7ffc3cca324f construct

0x7ffc3cca324e construct

0x7ffc3cca327f copy construct

0x7ffc3cca324e destruct

0x7ffc3cca324f destruct

0x7ffc3cca327f destruct

注1:2次缺省構造函數調用:用于構造a1、a2

注2:1次拷貝構造函數調用:用于拷貝構造返回值

注3:這兒仍然用右值引用優(yōu)化掉了一次拷貝函數調用:返回值賦值給a

(2)返回參數變量

(3)返回全局變量

(4)返回復合數據類型中的成員變量

(5)返回值賦值給已構造好的變量(此時會調用operator==賦值運算符)

以上就是詳解C++編譯器優(yōu)化技術的詳細內容,更多關于C++編譯器優(yōu)化技術的資料請關注服務器之家其它相關文章!

原文鏈接:https://www.cnblogs.com/kekec/p/11303391.html

延伸 · 閱讀

精彩推薦
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++c++ 單線程實現同時監(jiān)聽多個端口

    c++ 單線程實現同時監(jiān)聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監(jiān)聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
主站蜘蛛池模板: 可以免费在线观看av的网站 | 亚洲精品综合 | 正在播放国产精品 | 亚洲高清在线视频 | 91精品国产一区二区三区 | 日本久久久久久 | 亚洲午夜视频 | 亚洲天堂一区 | 亚洲视频在线免费观看 | 国产婷婷色一区二区三区 | 中文精品在线观看 | 男人的天堂久久 | 亚洲男人网 | 欧美激情一区二区 | 国内精品视频在线观看 | 午夜国产精品成人 | 午夜av毛片 | 99re视频在线观看 | 免费一二区 | 国产欧美日韩综合精品 | 在线观看黄色电影 | 亚洲高清资源 | 亚洲精品一区二区三区蜜桃久 | 国产精品日韩 | 国产v日产∨综合v精品视频 | 亚洲一区二区三区免费观看 | 成人小视频在线观看 | 欧美日韩在线免费 | 先锋资源在线观看 | 成人免费一区二区三区视频网站 | 成人亚洲一区二区 | 国产在线视频网站 | 毛片一级片 | 91视视频在线观看入口直接观看 | 亚洲一区二区在线视频 | 久久久亚洲成人 | 免费高清av | t66y最新地址一地址二69 | 亚洲欧美日韩精品 | 欧美日韩中文在线 | 日日摸夜夜添夜夜添高潮视频 |