自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C++聲明放置正確應(yīng)用方式

開發(fā) 后端
如果我們能夠正確的進(jìn)行C++聲明放置,將會(huì)給我們的應(yīng)用程序帶來(lái)非常大的好處。在這里我們將會(huì)在這里為大家詳細(xì)介紹相關(guān)操作方法。

C++編程語(yǔ)言既然被看做是C語(yǔ)言的升級(jí)版本,它必然會(huì)具有C語(yǔ)言中的很多功能。不過(guò)其中還是有很多比C語(yǔ)言更加優(yōu)化的功能。比如C++聲明的一些內(nèi)容等。C++聲明放置將會(huì)對(duì)性能產(chǎn)生顯著影響。同樣,對(duì)postfix和prefix運(yùn)算符的選擇也會(huì)影響性能。這一部分我們集中討論四個(gè)問(wèn)題:初始化v.s 賦值,在程序確實(shí)要使用的地方放置聲明,構(gòu)造函數(shù)的初始化列表,prefix v.s postfix運(yùn)算符。#t#

C++編程語(yǔ)言可以支持很多程序設(shè)計(jì)風(fēng)格,能夠在很大程度上幫助開發(fā)人員提高開發(fā)效率。初學(xué)者們可能還對(duì)C++中的聲明有些不太明白,在這里我們將會(huì)為大家詳細(xì)介紹一下C++聲明放置的相關(guān)方法,方便大家理解。

(1) 請(qǐng)使用初始化而不是賦值

在C語(yǔ)言中只允許在一個(gè)函數(shù)體的開頭進(jìn)行變量的聲明,然而C++聲明放置可以出現(xiàn)在程序的任何位置。這樣做的目的是希望把對(duì)象的聲明拖延到確實(shí)要使用它的時(shí)候再進(jìn)行。這樣做可以有兩個(gè)好處:

1. 確保了對(duì)象在它被使用前不會(huì)被程序的其他部分惡意修改。如果對(duì)象在開頭就被聲明然而卻在20行以后才被使用的話,就不能做這樣的保證。

2. 使我們有機(jī)會(huì)通過(guò)用初始化取代賦值來(lái)達(dá)到性能的提升,從前聲明只能放在開頭,然而往往開始的時(shí)候我們還沒有獲得我們想要的值,因此初始化所帶來(lái)的好處就無(wú)法被應(yīng)用。但是現(xiàn)在我們可以在我們獲得了想要的值的時(shí)候直接進(jìn)行初始化,從而省去了一步。

注意,或許對(duì)于基本類型來(lái)說(shuō),初始化和賦值之間可能不會(huì)有什么差異,但是對(duì)于用戶定義的類型來(lái)說(shuō),二者就會(huì)帶來(lái)顯著的不同,因?yàn)橘x值會(huì)多進(jìn)行一次函數(shù)調(diào)用----operator =。因此當(dāng)我們?cè)谫x值和初始化之間進(jìn)行選擇的話,初始化應(yīng)該是我們的***。

(2) C++聲明放置在合適的位置

在一些場(chǎng)合,通過(guò)移動(dòng)聲明到合適的位置所帶來(lái)的性能提升應(yīng)該引起我們足夠的重視。例如:

  1. bool is_C_Needed();   
  2. void use()   
  3. {   
  4. C c1;   
  5. if (is_C_Needed() == false)   
  6. {   
  7. return; //c1 was not needed   
  8. }   
  9. //use c1 here   
  10. return;   

上面這段代碼中對(duì)象c1即使在有可能不使用它的情況下也會(huì)被創(chuàng)建,這樣我們就會(huì)為它付出不必要的花費(fèi),有可能你會(huì)說(shuō)一個(gè)對(duì)象c1能浪費(fèi)多少時(shí)間,但是如果是這種情況呢:C c1[1000];我想就不是說(shuō)浪費(fèi)就浪費(fèi)了。但是我們可以通過(guò)移動(dòng)聲明c1的位置來(lái)改變這種情況:

  1. void use()   
  2. {   
  3. if (is_C_Needed() == false)   
  4. {   
  5. return; //c1 was not needed   
  6. }   
  7. C c1; //moved from the block's beginning   
  8. //use c1 here   
  9. return;   

怎么樣,程序的性能是不是已經(jīng)得到很大的改善了呢?因此請(qǐng)仔細(xì)分析你的代碼,C++聲明放置所帶來(lái)的好處是你難以想象的。

(3) 初始化列表

我們都知道,初始化列表一般是用來(lái)初始化const或者reference數(shù)據(jù)成員。但是由于他自身的性質(zhì),我們可以通過(guò)使用初始化列表來(lái)實(shí)現(xiàn)性能的提升。我們先來(lái)看一段程序:

  1. class Person   
  2. {   
  3. private:   
  4. C c_1;   
  5. C c_2;   
  6. public:   
  7. Person(const C& c1, const C& c2 ): c_1(c1), c_2(c2) {}   
  8. }; 

當(dāng)然構(gòu)造函數(shù)我們也可以這樣寫:

  1. Person::Person(const C& c1, const C& c2)   
  2. {   
  3. c_1 = c1;   
  4. c_2 = c2;   

那么究竟二者會(huì)帶來(lái)什么樣的性能差異呢,要想搞清楚這個(gè)問(wèn)題,我們首先要搞清楚二者是如何執(zhí)行的,先來(lái)看初始化列表:數(shù)據(jù)成員的聲明操作都是在構(gòu)造函數(shù)執(zhí)行之前就完成了,在構(gòu)造函數(shù)中往往完成的只是賦值操作,然而初始化列表直接是在數(shù)據(jù)成員聲明的時(shí)候就進(jìn)行了初始化,因此它只執(zhí)行了一次copy constructor。再來(lái)看在構(gòu)造函數(shù)中賦值的情況:首先,在構(gòu)造函數(shù)執(zhí)行前會(huì)通過(guò)default constructor創(chuàng)建數(shù)據(jù)成員,然后在構(gòu)造函數(shù)中通過(guò)operator =進(jìn)行賦值。因此它就比初始化列表多進(jìn)行了一次函數(shù)調(diào)用。性能差異就出來(lái)了。但是請(qǐng)注意,如果你的數(shù)據(jù)成員都是基本類型的話,那么為了程序的可讀性就不要使用初始化列表了,因?yàn)榫幾g器對(duì)兩者產(chǎn)生的匯編代碼是相同的。

(4) postfix VS prefix 運(yùn)算符

prefix運(yùn)算符++和—比它的postfix版本效率更高,因?yàn)楫?dāng)postfix運(yùn)算符被使用的時(shí)候,會(huì)需要一個(gè)臨時(shí)對(duì)象來(lái)保存改變以前的值。對(duì)于基本類型,編譯器會(huì)消除這一份額外的拷貝,但是對(duì)于用戶定義類型,這似乎是不可能的。因此請(qǐng)你盡可能使用prefix運(yùn)算符。

以上就是對(duì)C++聲明放置的相關(guān)介紹。

責(zé)任編輯:曹凱 來(lái)源: 博客園
相關(guān)推薦

2010-02-05 17:49:24

C++常量引用

2010-02-01 15:26:44

C++ inline函

2010-02-22 14:09:08

WCF Dispose

2010-03-04 13:30:11

Python file

2010-03-03 17:58:16

Python同步隊(duì)列

2010-01-25 11:29:33

Android計(jì)時(shí)器

2021-07-02 16:13:01

區(qū)塊鏈金融數(shù)據(jù)庫(kù)

2010-03-03 17:33:52

Python讀取XML

2010-03-04 14:51:21

Python Conf

2009-12-07 14:38:14

PHP foreach

2010-05-28 15:16:40

MySQL 資源

2010-02-22 10:42:12

WCF Stream

2010-05-25 18:01:35

linux MySQL

2010-05-28 19:20:36

MySQL mysql

2010-07-21 10:50:48

SQL Server存

2010-07-26 17:43:34

SQL Server

2010-03-04 09:40:52

Python Clas

2010-03-05 15:01:29

Python解析XML

2010-08-18 16:45:40

IBM DB2 Cat

2010-03-04 14:02:51

Python大小寫
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)