最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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關(guān)鍵字到這個函數(shù)。

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

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

除了編譯時計算的性能優(yōu)化,constexpr的另外一個優(yōu)勢是,它允許函數(shù)被應(yīng)用在以前調(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中細分出來成為一個關(guān)鍵字, 而 const從1983年 c++ 剛改名的時候就存在了... 如果你初學(xué)c++, 應(yīng)當(dāng)盡可能的, 合理的使用constexpr來幫助編譯器優(yōu)化代碼。

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

相關(guān)文章

  • C語言JNI的動態(tài)注冊詳解

    C語言JNI的動態(tài)注冊詳解

    這篇文章主要介紹了JAVA JNI的動態(tài)注冊,這里提供簡單實例代碼,需要的朋友可以參考下,小編覺得寫的還不錯,希望能給你帶來幫助
    2021-08-08
  • C++ 中封裝的含義和簡單實現(xiàn)方式

    C++ 中封裝的含義和簡單實現(xiàn)方式

    這篇文章主要介紹了C++ 中封裝的含義和簡單實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • c++ std::sort使用自定義的比較函數(shù)排序方式

    c++ std::sort使用自定義的比較函數(shù)排序方式

    文章介紹了使用std::sort對容器內(nèi)元素進行排序的基本方法,包括自定義排序函數(shù)和在類中調(diào)用自定義成員函數(shù)進行排序的方法,文章還指出了在傳遞成員函數(shù)指針時可能會遇到的錯誤,并提供了使用Lambda表達式的解決辦法
    2025-02-02
  • C++基礎(chǔ)概念講述

    C++基礎(chǔ)概念講述

    這篇文章主要介紹了C++基礎(chǔ)概念,??本次為C++的一個開篇,重點是更好的理解C++相對于其他編程語言的一個特性,之后會持續(xù)更新,本次專欄計劃是掌握C++的基礎(chǔ)語法以及常用特性,并且從細節(jié)上去理解,需要的朋友可以參考一下
    2021-12-12
  • C++如何使用new來初始化指向類的指針

    C++如何使用new來初始化指向類的指針

    這篇文章主要介紹了C++如何使用new來初始化指向類的指針問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • 解析OpenSSL1.1.1?centos7安裝編譯aes的c++調(diào)用

    解析OpenSSL1.1.1?centos7安裝編譯aes的c++調(diào)用

    這篇文章主要介紹了OpenSSL1.1.1?centos7安裝編譯aes的c++調(diào)用,實現(xiàn)方法也很簡單,主要是在該文檔內(nèi)加入openssl的lib路徑,感興趣的朋友跟隨小編一起看看吧
    2022-03-03
  • c語言內(nèi)存泄露示例解析

    c語言內(nèi)存泄露示例解析

    從1988年著名的莫里斯蠕蟲 攻擊到有關(guān) Flash Player 和其他關(guān)鍵的零售級程序的最新安全警報都與緩沖區(qū)溢出有關(guān):“大多數(shù)計算機安全漏洞都是緩沖區(qū)溢出”,Rodney Bates 在 2004 年寫道
    2013-09-09
  • 淺析c/c++中函數(shù)的參數(shù)傳遞

    淺析c/c++中函數(shù)的參數(shù)傳遞

    c/c++中,函數(shù)可以傳遞的參數(shù)有三種形式,值、引用和指針。以下分別對這三種形式進行了介紹,需要的朋友可以過來參考下
    2013-07-07
  • 如何用C寫一個web服務(wù)器之I/O多路復(fù)用

    如何用C寫一個web服務(wù)器之I/O多路復(fù)用

    本文主要介紹了如何用C寫一個web服務(wù)器之I/O多路復(fù)用,本次選擇了 I/O 模型的優(yōu)化,因為它是服務(wù)器的基礎(chǔ),這個先完成的話,后面的優(yōu)化就可以選擇各個模塊來進行,不必進行全局化的改動了。
    2021-05-05
  • C++?vector與數(shù)組轉(zhuǎn)換寫入/讀出文件方式

    C++?vector與數(shù)組轉(zhuǎn)換寫入/讀出文件方式

    這篇文章主要介紹了C++?vector與數(shù)組轉(zhuǎn)換寫入/讀出文件方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11

最新評論

曲沃县| 莲花县| 大田县| 九龙城区| 十堰市| 贵德县| 双辽市| 石首市| 巴彦县| 北川| 金秀| 乌拉特后旗| 亳州市| 克什克腾旗| 余江县| 科技| 衡南县| 新津县| 梅河口市| 靖远县| 余江县| 皋兰县| 江山市| 万源市| 祁阳县| 五大连池市| 旬邑县| 正阳县| 淮南市| 电白县| 余姚市| 齐河县| 新源县| 剑阁县| 文山县| 棋牌| 林西县| 丹东市| 黄山市| 福安市| 南乐县|