GoogleCpp風格指南 4 Google奇技

2021-06-27 13:02:37 字數 3250 閱讀 5905

4 來自google的奇技 google-specific magic

google用了很多自己的實現技巧/工具使 c++**更加健壯, 我們使用c++的方式可能和你在其他地方見到的有所不同;

[removed]

4.1 智慧型指標

tip如果確實需要使用智慧型指標的話,scoped_ptr完全可以勝任; 你應該只在非常特定的情況下使用std::tr1::shared_ptr, 例如stl容器中的物件; 任何情況下都不要使用auto_ptr;

"智慧型"指標看上去是指標, 其實是附加了語義的物件; 以 scoped_ptr為例; scoped_ptr被銷毀時, 它會刪除所指向的物件; shared_ptr也是如此; 並且 shared_ptr實現了 引用計數, 所以最好乙個 shared_ptr物件析構時, 如果檢測到引用次數為0, 就會銷毀所指向的物件;

一般來說, 我們傾向於設計物件隸屬明確的**, 最明確的物件隸屬是根本不使用指標, 直接將物件作為乙個作用域或區域性變數使用; 另一種極端做法是, 引用計數指標不屬於任何物件; 這種方法的問題是容易導致迴圈引用, 或者導致某個物件無法刪除的詭異狀態, 而且在每一次拷貝或賦值時連原子操作都會很慢;

雖然不推薦使用引用計數指標,但有些時候它們的確是最簡單有效的解決方案;

(譯註 看來google所謂的不同之處, 在於盡量避免使用智慧型指標, 使用時也盡量區域性化, 並且安全第一);

<<<

[add] 

所有權和智慧型指標 ownership and smart pointers

建議給動態分配的物件乙個單獨的固定的擁有者; 使用smart ptr來轉移所有權;

定義:"所有權"是乙個記錄技術bookkeeping technique, 用來管理動態建立的記憶體(和其他資源); 動態建立的物件的所有者是乙個物件或乙個函式, 負責保證物件在被刪除的時候不再被使用; 所有權有時可以被共享, 這種情況下, 最後乙個所有者負責刪除它; 即便所有權沒有被共享, 它也可以從一段**轉移到另一段; 

"smart" pointer 是用起來像指標乙個的類, e.g. 過載overload了 * 和 -> 操作符; 一些smart ptr型別可以用來將所有權記錄自動化automate ownership bookkeeping, 確保這些責任和所有者對應;

std::unique_ptr ( 是乙個smart ptr型別, 在c++11中引入, 表示對於動態建立的物件的專門的所有權; 當std::unique_ptr離開生命週期的時候, 物件會被刪除; 它不能被copy, 但是可以用move來將所有權轉移; 

std::shared_ptr  是乙個smart ptr型別, 表示對於動態建立的物件的共享所有權; std::shared_ptr可以被copy, 物件的所有權可以在各份copy之間共享, 當最後乙個std::shared_ptr被銷毀的時候物件會被刪除;

優點:- 如果沒有所有權邏輯的話, 無形中是不可能管理好動態分配的記憶體的;

- 轉移物件的所有權比copy物件來得更輕便(如果可以copy的話);

- 轉移物件的所有權比"borrowing"乙個指標或引用更簡單, 因為這樣減少了在兩個使用者之間協調物件生存期的需求;

- smart ptr可以讓所有權邏輯清晰, 增加可讀性, 自我文件式, 減少混淆; 

- smart ptr去除了人工的所有權記錄, 簡化了**, 排除錯誤error的大型類;

- 對於const物件, 比起深拷貝來說, 共享所有權可以更簡單而有效;

缺點:- 所有權必須由指標(smart或plain)來代表和轉移; 指標的語義比值語義更複雜, 特別在api中, 你不得不在各種問題中考慮所有權, 別名, 生存期以及易變性mutability;

- 對值語義的效能消耗常常被高估了, 因此所有權轉移帶來的效能補助可能不及在可讀性和複雜性上的損失;

- 轉移所有權的apis強制它們的客戶使用乙個單獨的記憶體管理模型;

- 使用smart ptr的**對於資源release的具體發生地點不明確; 

- std::unique_ptr使用c++11的move語義表達所有權轉移, 這是相對較新的特性, 可能讓一些程式設計師感到困惑;

- 共享所有權容易誘使人們不再進行仔細的所有權設計, 從而使得系統設計變得混亂; 

- 共享所有權需要在執行時進行顯式地進行記錄, 消耗比較昂貴;

- 在一些情況下(e.g. 迴圈引用cyclic references), 擁有共享所有權的物件可能永遠的都不會被刪除;

- smart ptr並不是普通plain指標的完美替代;

結論:如果必須進行動態分配, 建議將所有權保留在負責分配記憶體的**部分; 如果另一塊**想要獲取這個物件, 考慮傳遞乙個copy, 或者傳遞乙個指標或引用但不要傳遞所有權; 建議使用 std::unique_ptr來明確所有權傳遞;  e.g. 1

2

std::unique_ptrfoofactory();

voidfooconsumer(std::unique_ptrptr);

沒有很好的理由的話, 不要將**設計成共享所有權的; 乙個原因是為了避免昂貴的copy操作; 要使用共享所有權條件是: 重大的效能獲益, 操作物件是不可變的immutable(i.e. std::shared_ptr); 如果使用了共享所有權, 建議使用 std::shared_ptr;

不要在新**中使用 scoped_ptr, 除非你想要和舊版本的c++保持相容; 永遠不要使用 std::auto_ptr, 用 std::unique_ptr代替它;  [ ]

<<<

4.2 cpplint

tip使用 cpplint.py檢查風格錯誤;

cpplint.py是乙個用來分析原始檔, 能檢查出多種風格錯誤的工具; 它並不完美, 甚至會漏報和誤報, 但它仍然是乙個非常有用的工具; 用行注釋 // nolint(行尾) // nolintnextline(前一行)可以忽略誤報;

---tbc---ycr

4G全城體驗

截止目前,杭州全城開通4g基站近600個,完成了杭州主城區以及下沙 濱江 蕭山 餘杭中心區域的td lte覆蓋,覆蓋面積達191平方公里,覆蓋人口約365萬,已初步具備了4g網路試商用的條件。至年底,將建設4g基站2000個,實現杭州八城區800萬人群的全覆蓋。據中國移動技術人員表示,目前已成功實現...

4G以上(含4G)記憶體與32位Linux系統

32位的桌面版ubuntu 估計其他發行版桌面版也是 預設不支援4g的記憶體,現如今有兩種方法,一種是安裝server版本的核心,另一種是啟用pae page address extension 實體地址擴充套件 即安裝pae核心。傳統的ia32架構只有32位位址匯流排,只能讓系統容納不超過4gb的...

國內4G頻段劃分

國內4g頻段劃分 2015年 4g網路建設如火如荼地進行,換手機大家幾乎都買的4g手機,那麼看到如下引數怎麼知道手機所支援的網路呢?sim 1 4g tdd lte td38 39 40 41 4g fdd lte lte1 3 4 7 3g td scdma umts td34 39,wcdma1...