2023年8月5日 星期六

C++:實作 Singleton 模式以及 static 的效能考量

本文為 C++ Software Design 書的第 37 節,以及 C++ Weekly - Ep 2 Cost of Using Statics 的內容。 


以下為利用 static 來實作 singleton 模式的範例:

class Object
{
  static Object& instance()
  {
    static Object obj;
    return obj;
  }
  
   Object& obj = instance();
   Object& instance_ref()
   {
     return obj;
   }
};
第一種實作方法為標準的 singleton 模式實作,使用的語法是 static local variable,並且在建立此變數時會是 thread-safe。儘管在之後每次呼叫 instance() 時不會再重新生成此變數,但是它總是得先確認此變數是否已經存在,也就是說當 instance() 被呼叫許多次時,每次都會花一點點時間在檢查 obj 是否已經被生成了。在這種情況下,第二種方法就不會有對於 obj 的檢查,因此可以提升效能。影片中的例子是用 valgrind 來 benchmark,其中 instruction 數目差距大約為兩倍。