[英]C++ singleton lazy initialization implementation and linkage seems conflict
C ++ Singleton設計模式我遇到了這個問題,並了解到有兩種方法可以在c ++中實現Singleton模式。
1)在堆中分配單個實例,並在instance()調用中返回
2)在instance()調用中返回靜態實例,這也稱為延遲初始化實現。
但是我認為第二種方法,即延遲初始化實現,由於以下原因是錯誤的。 從instance()調用返回的靜態對象具有內部鏈接,並且將在不同的轉換單元中具有唯一的副本。 因此,如果用戶修改單例,它將不會反映在任何其他翻譯單元中。
但是有很多說法表明第二種實現是正確的,我是否缺少某些東西?
在方法的上下文中, static
關鍵字與鏈接無關。 它只影響已定義變量的“存儲類”。 對於靜態局部變量,標准明確規定:
9.3.6成員函數中的靜態局部變量始終引用同一對象,無論成員函數是否為內聯。
因此,將代碼放在頭文件還是cpp文件中都沒有關系。
請注意,正如KerrekSB所指出的那樣,對於自由/非成員函數,它確實取決於函數的鏈接。
實現對象名稱的鏈接無關緊要。 重要的是你用來訪問對象的函數的名稱的聯動, 這個名字有當然,外部鏈接的,:
something.h:
Thing & TheThing(); // external linkage
something.cpp:
#include "thing.h"
Thing & TheThing() { static Thing impl; return impl; }
程序中對名稱TheThing
每次使用都指向同一個實體,即thing.cpp中(唯一)定義的函數。
請記住,鏈接是名稱的屬性,而不是對象的屬性。
您錯了,因為單例是在一個轉換單元中定義的,該轉換單元包含返回它的函數的定義。 這意味着所有想要使用單例的翻譯單元都將其詢問給實際定義它的單個單元,最后所有單元都使用相同的對象(如單例模式所期望的那樣:-)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.