91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++怎么避免單例

發布時間:2021-11-24 16:41:50 來源:億速云 閱讀:175 作者:iii 欄目:大數據

這篇文章主要講解了“C++怎么避免單例”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“C++怎么避免單例”吧!

I.3: Avoid singletons(避免單例)

Reason(原因)

Singletons are basically complicated global objects in disguise.

單例基本上就是一個復雜的全局對象的偽裝。

Example(示例)

class Singleton {    // ... lots of stuff to ensure that only one Singleton object is created,    // that it is initialized properly, etc.};

There are many variants of the singleton idea. That's part of the problem.
存在許多單例想法的版本。這是問題的一個方面。

Note(注意)

If you don't want a global object to change, declare it const or constexpr.

如果你不希望全局對象發生改變,將其定義為常量或常量表達式。

Exception(例外)

You can use the simplest "singleton" (so simple that it is often not considered a singleton) to get initialization on first use, if any:

你可以使用最簡單的“單例”(簡單到經常不被認為是單例)以便在第一次使用時獲取初始值。

X& myX(){    static X my_x {3};    return my_x;}

這是解決初始化順序相關問題的最有效手段。在多線程環境中,靜態對象的的初始化不會觸發競爭條件(除非你不小心在某個共享對象的構造函數中訪問了它)

譯者注:這也是目前單例設計模式在現代C++中最新實現。

注意局部的靜態變量不包含競爭條件。然而,如果X的析構動作牽涉到需要被同步的操作,我們必須使用一個次簡單的解決方案。例如:

X& myX(){    static auto p = new X {3};    return *p;  // potential leak}

Now someone must delete that object in some suitably thread-safe way. That's error-prone, so we don't use that technique unless

現在某個角色必須以一種合適的線程安全的方式刪除那個對象。由于容易引發錯誤,因此我們不會使用這個技術,除非

  • myX is in multi-threaded code,

    myX就在多線程代碼中

  • that X object needs to be destroyed (e.g., because it releases a resource), and

    X對象需要被銷毀(例如,因為它釋放資源)

  • X's destructor's code needs to be synchronized.

    X的析構函數的代碼需要被同步。

譯者注:函數內部構建的靜態對象在程序退出時會被自動析構,如果希望自己控制析構的時機就只能動態構建對象以避開自動析構。

If you, as many do, define a singleton as a class for which only one object is created, functions like myX are not singletons, and this useful technique is not an exception to the no-singleton rule.

如果你像很多人一樣為只創建一個的對象定義單例類,像myX那樣的函數沒有使用單例,這個有用的技術也不是禁止單例規格的例外。

譯者注:做個做法不是單例,也就不會違反禁止單例的規則。

Enforcement(實施建議)

Very hard in general.

通常會十分困難。

  • Look for classes with names that include singleton.

    找到名稱中包含singletong的類。

  • Look for classes for which only a single object is created (by counting objects or by examining constructors).

    找到只創建一個對象的類(通過對對象計數或檢查(監控)構造函數)

  • If a class X has a public static function that contains a function-local static of the class' type X and returns a pointer or reference to it, ban that.

    如果類X有一個公開的靜態函數,在其內部存在一個類型為X、作用域為該函數范圍的局部靜態變量并返回這個變量的指針或引用時,禁止它。

感謝各位的閱讀,以上就是“C++怎么避免單例”的內容了,經過本文的學習后,相信大家對C++怎么避免單例這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

华池县| 盐山县| 永城市| 德兴市| 吴堡县| 黄陵县| 随州市| 枣庄市| 伊通| 鹤峰县| 柳林县| 崇左市| 海伦市| 丹棱县| 四子王旗| 勃利县| 高平市| 麻城市| 碌曲县| 阿尔山市| 卢氏县| 柯坪县| 玉树县| 富民县| 临沧市| 大渡口区| 神木县| 双江| 新竹县| 绥阳县| 岳阳市| 开化县| 临江市| 昭觉县| 拜泉县| 灵寿县| 江北区| 西乌珠穆沁旗| 抚松县| 宜昌市| 临潭县|