欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++11?constexpr使用詳解

 更新時間:2021年12月10日 10:57:44   作者:滴水瓦  
constexpr是一種比const?更嚴格的束縛,?它修飾的表達式本身在編譯期間可知,?并且編譯器會盡可能的?evaluate?at?compile?time,本文重點給大家介紹C++11?constexpr使用,需要的朋友可以參考下

C++11為了提高代碼執(zhí)行效率做了一些改善。這種改善之一就是:生成常量表達式,允許程序利用編譯時的計算能力。假如你熟悉模板元編程,你將發(fā)現(xiàn)constexpr使這一切變得更加簡單。constexpr使我們很容易利用上編譯時編程的優(yōu)勢。

常量表達式主要是允許一些計算發(fā)生在編譯時,即發(fā)生在代碼編譯而不是運行的時候。這是很大的優(yōu)化:假如有些事情可以在編譯時做,它將只做一次,而不是每次程序運行時。需要計算一個編譯時已知的常量,比如特定值的sine或cosin?確實你亦可以使用庫函數(shù)sin或cos,但那樣你必須花費運行時的開銷。使用constexpr,你可以創(chuàng)建一個編譯時的函數(shù),它將為你計算出你需要的數(shù)值,用戶的電腦將不需要做這些工作。

1.constexpr初探

為了使函數(shù)獲取編譯時計算的能力,你必須指定constexpr關鍵字到這個函數(shù)。

constexpr int multiply (int x, int y)
{
    return x * y;
}

// 將在編譯時計算
const int val = multiply( 10, 10 );

除了編譯時計算的性能優(yōu)化,constexpr的另外一個優(yōu)勢是,它允許函數(shù)被應用在以前調(diào)用宏的所有場合。

例如,你想要一個計算數(shù)組size的函數(shù),size是10的倍數(shù)。如果不用constexpr,你需要創(chuàng)建一個宏或者使用模板,因為你不能用函數(shù)的返回值去聲明數(shù)組的大小。但是用constexpr,你就可以調(diào)用一個constexpr函數(shù)去聲明一個數(shù)組。

constexpr int getDefaultArraySize (int multiplier)
{
    return 10 * multiplier;
}

int my_array[ getDefaultArraySize( 3 ) ];
int a = 4;  //非常量表達式
getDefaultArraySize(a);  //ok

constexpr修飾的函數(shù),簡單的來說,如果其傳入的參數(shù)可以在編譯時期計算出來,那么這個函數(shù)就會產(chǎn)生編譯時期的值。但是,傳入的參數(shù)如果不能在編譯時期計算出來,那么constexpr修飾的函數(shù)就和普通函數(shù)一樣了。不過,我們不必因此而寫兩個版本,所以如果函數(shù)體適用于constexpr函數(shù)的條件,可以盡量加上constexpr。

2.constexpr修飾函數(shù)的限制

一個constexpr有一些必須遵循的嚴格要求:

  • 函數(shù)中只能有一個return語句(但允許包含typedefs、 using declaration && directives、靜態(tài)斷言等)
  • 只能調(diào)用其它constexpr函數(shù)
  • 只能使用全局constexpr變量

注意遞歸并不受限制,但只允許一個返回語句,那如何實現(xiàn)遞歸呢?可以使用三元運算符(?:)。例如,計算n的階乘:

constexpr int factorial (int n) {
    return n > 0 ? n * factorial( n - 1 ) : 1;
}

現(xiàn)在你可以使用factorial(2),編譯器將在編譯時計算這個值,這種方式運行更巧妙的計算,與內(nèi)聯(lián)截然不同。你無法內(nèi)聯(lián)一個遞歸函數(shù)。

3.使用編譯時對象

constexpr修飾類的構(gòu)造函數(shù),即保證如果提供給該構(gòu)造函數(shù)的參數(shù)都是constexpr,那么產(chǎn)生的對象中的所有成員都會是constexpr,該對象也就是constexpr對象了,可用于各種只能使用constexpr的場合。注意,constexpr構(gòu)造函數(shù)必須有一個空的函數(shù)體,即所有成員變量的初始化都放到初始化列表中。
假如你有一個Circle類:

class Circle
{
    public:
    constexpr Circle (int x, int y, int radius) : _x( x ), _y( y ), _radius( radius ) {}
    constexpr double getArea () {
        return _radius * _radius * 3.1415926;
    }
private:
    int _x;
    int _y;
    int _radius;
};

將構(gòu)造函數(shù)和getArea聲明為constexpr,這樣在編譯期間,便能構(gòu)造一個對象并能調(diào)用getArea函數(shù)獲得area:

constexpr Circle c( 0, 0, 10 );
constexpr double area = c.getArea();

4.constexpr vs const的區(qū)別

假如你將一個成員函數(shù)標記為constexpr,則順帶也將它標記為了const。如果你將一個變量標記為constexpr,則同樣它是const的。但相反并不成立,一個const的變量或函數(shù),并不是constexpr的。

語義上:

constexpr:告訴編譯器我可以是編譯期間可知的,盡情的優(yōu)化我吧。

const:告訴程序員沒人動得了我,放心的把我傳出去;或者放心的把變量交給我,我啥也不動就瞅瞅。

語法上:

constexpr是一種比const 更嚴格的束縛, 它修飾的表達式本身在編譯期間可知, 并且編譯器會盡可能的 evaluate at compile time. 在constexpr 出現(xiàn)之前, 可以在編譯期初始化的const都是implicit constexpr. 直到c++ 11, constexpr才從const中細分出來成為一個關鍵字, 而 const從1983年 c++ 剛改名的時候就存在了... 如果你初學c++, 應當盡可能的, 合理的使用constexpr來幫助編譯器優(yōu)化代碼。

到此這篇關于C++11 constexpr使用的文章就介紹到這了,更多相關C++11 constexpr使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C++入門語法之函數(shù)重載詳解

    C++入門語法之函數(shù)重載詳解

    這篇文章主要為大家詳細介紹了C++入門語法之函數(shù)重載,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • C++基于boost asio實現(xiàn)sync tcp server通信流程詳解

    C++基于boost asio實現(xiàn)sync tcp server通信流程詳解

    這篇文章主要介紹了C++基于boost asio實現(xiàn)sync tcp server通信的流程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • 最新C語言自定義類型詳解

    最新C語言自定義類型詳解

    生活當中有很多物品是不能簡單的用整型、浮點型、字符型來區(qū)分,它們常常是復雜的集合,比如人,一個人擁有年齡,身高、體重、學歷......等信息,我們可以用結(jié)構(gòu)體來實現(xiàn)準確描述人這種復雜集合,這篇文章主要介紹了C語言?自定義類型,需要的朋友可以參考下
    2023-01-01
  • C++實現(xiàn)LeetCode(25.每k個一組翻轉(zhuǎn)鏈表)

    C++實現(xiàn)LeetCode(25.每k個一組翻轉(zhuǎn)鏈表)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(25.每k個一組翻轉(zhuǎn)鏈表),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 淺談C++性能榨汁機之偽共享

    淺談C++性能榨汁機之偽共享

    使給定內(nèi)存位置被一個線程所訪問,可能還是會有乒乓緩存的存在,是因為另一種叫做偽共享(false sharing)的效應。即使數(shù)據(jù)存儲在緩存行中,多個線程對數(shù)據(jù)中的成員進行訪問時,硬件緩存還是會產(chǎn)生乒乓緩存。本文將介紹C++中的偽共享
    2021-06-06
  • C++實現(xiàn)圖書管理系統(tǒng)源碼

    C++實現(xiàn)圖書管理系統(tǒng)源碼

    這篇文章主要為大家詳細介紹了C++實現(xiàn)圖書管理系統(tǒng)源碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 一起聊聊C++中的智能指針

    一起聊聊C++中的智能指針

    C++?是手工管理內(nèi)存的分配和釋放,這給了程序員極大的自由度也給了我們極高的門檻,弄不好就得內(nèi)存泄露。使用智能指針能更好的管理堆內(nèi)存,本文主要給大家介紹一下c++的智能指針,需要的朋友可以參考下
    2022-07-07
  • C++中指針函數(shù)與函數(shù)指針的使用

    C++中指針函數(shù)與函數(shù)指針的使用

    今天小編就為大家分享一篇關于C++中指針函數(shù)與函數(shù)指針的使用,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • QT編寫tcp通信工具(Server端)

    QT編寫tcp通信工具(Server端)

    這篇文章主要為大家詳細介紹了QT編寫tcp通信工具,一個類似網(wǎng)上常見的網(wǎng)絡調(diào)試工具,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C語言之結(jié)構(gòu)體定義 typedef struct 用法詳解和用法小結(jié)

    C語言之結(jié)構(gòu)體定義 typedef struct 用法詳解和用法小結(jié)

    這篇文章主要介紹了C語言的結(jié)構(gòu)體定義typedef struct用法詳解和用法小結(jié),typedef是類型定義,typedef struct 是為了使用這個結(jié)構(gòu)體方便,感興趣的同學可以參考閱讀
    2023-03-03

最新評論