激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

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

服務(wù)器之家 - 編程語言 - C/C++ - C++11 constexpr使用詳解

C++11 constexpr使用詳解

2022-03-11 13:46滴水瓦 C/C++

constexpr是一種比const 更嚴(yán)格的束縛, 它修飾的表達(dá)式本身在編譯期間可知, 并且編譯器會(huì)盡可能的 evaluate at compile time,本文重點(diǎn)給大家介紹C++11 constexpr使用,需要的朋友可以參考下

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

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

1.constexpr初探

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

?
1
2
3
4
5
6
7
constexpr int multiply (int x, int y)
{
    return x * y;
}
 
// 將在編譯時(shí)計(jì)算
const int val = multiply( 10, 10 );

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

例如,你想要一個(gè)計(jì)算數(shù)組size的函數(shù),size是10的倍數(shù)。如果不用constexpr,你需要?jiǎng)?chuàng)建一個(gè)宏或者使用模板,因?yàn)槟悴荒苡煤瘮?shù)的返回值去聲明數(shù)組的大小。但是用constexpr,你就可以調(diào)用一個(gè)constexpr函數(shù)去聲明一個(gè)數(shù)組。

?
1
2
3
4
5
6
7
8
constexpr int getDefaultArraySize (int multiplier)
{
    return 10 * multiplier;
}
 
int my_array[ getDefaultArraySize( 3 ) ];
int a = 4;  //非常量表達(dá)式
getDefaultArraySize(a);  //ok

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

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

一個(gè)constexpr有一些必須遵循的嚴(yán)格要求:

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

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

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

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

3.使用編譯時(shí)對(duì)象

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

?
1
2
3
4
5
6
7
8
9
10
11
12
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)造一個(gè)對(duì)象并能調(diào)用getArea函數(shù)獲得area:

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

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

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

語義上:

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

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

語法上:

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

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

原文鏈接:https://www.cnblogs.com/DswCnblog/p/6513310.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 91看片入口 | 久草在线观看福利 | 综合网日日天干夜夜久久 | 九九精品在线观看 | 国产电影精品久久 | 被玩坏了的女老师(高h np) | 线观看免费完整aaa 一二区成人影院电影网 | 国产精品久久久久永久免费 | 免费a视频在线观看 | 4p一女两男做爰在线观看 | www.成人精品 | 一级外国毛片 | 欧美3p激情一区二区三区猛视频 | 国产精品视频自拍 | 精品一区二区三区免费 | 欧美wwwsss9999 | 日本在线观看视频网站 | 日韩深夜视频 | 91成人影库 | 欧美性生交大片 | 日本欧美一区二区三区在线观看 | 一本视频在线观看 | 欧美成人一级视频 | 毛片在线视频在线播放 | 最新欧美精品一区二区三区 | 久久久久久久九九九九 | 免费黄色在线观看网站 | 久久精品之| 黄污网站在线 | 操碰在线视频 | 麻豆视频在线观看免费网站 | 久久电影一区二区 | 99国语露脸久久精品国产ktv | 中文字幕精品亚洲 | 国产一区二区三区视频在线 | 手机国产乱子伦精品视频 | 久久777国产线看观看精品 | 欧美一级鲁丝片免费看 | 国产欧美日韩久久久 | 国产女同疯狂激烈互摸 | 久久tv免费国产高清 |