<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Singleton static und lazy creation]]></title><description><![CDATA[<p>Hallo Leuts,</p>
<p>Eine kurze Frage zu statischen lokalen Variablen.</p>
<p>in einer Funktion:</p>
<p>type &amp;singleton()<br />
{<br />
static type instance;<br />
return instance;<br />
}</p>
<p>Und wenn ich schon dabei bin. Gibt es eine gängige/anerkannte Übersetzung für &quot;lazy creation&quot;?</p>
<p>Wird der Speicher für die Variable erst reserviert wenn die Funktion das erste mal aufgerufen wird oder verhält sie sich wie eine globale Variable? Oder anders ausgedrückt. Handelt es sich hierbei um &quot;lazy creation&quot;?</p>
<p>Danke,<br />
Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/297368/singleton-static-und-lazy-creation</link><generator>RSS for Node</generator><lastBuildDate>Fri, 14 Aug 2026 11:03:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/297368.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 25 Dec 2011 23:18:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Singleton static und lazy creation on Sun, 25 Dec 2011 23:18:25 GMT]]></title><description><![CDATA[<p>Hallo Leuts,</p>
<p>Eine kurze Frage zu statischen lokalen Variablen.</p>
<p>in einer Funktion:</p>
<p>type &amp;singleton()<br />
{<br />
static type instance;<br />
return instance;<br />
}</p>
<p>Und wenn ich schon dabei bin. Gibt es eine gängige/anerkannte Übersetzung für &quot;lazy creation&quot;?</p>
<p>Wird der Speicher für die Variable erst reserviert wenn die Funktion das erste mal aufgerufen wird oder verhält sie sich wie eine globale Variable? Oder anders ausgedrückt. Handelt es sich hierbei um &quot;lazy creation&quot;?</p>
<p>Danke,<br />
Martin</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2160951</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2160951</guid><dc:creator><![CDATA[Martin Kalbfuß]]></dc:creator><pubDate>Sun, 25 Dec 2011 23:18:25 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton static und lazy creation on Sun, 25 Dec 2011 23:22:49 GMT]]></title><description><![CDATA[<p>Reserviert wird der Speicher im Prinzip schon beim Laden der Binary. Konstruiert wird das Objekt aber erst beim ersten Aufruf der Funktion, außer es handelt sich z.B. um einen primitiven Datentyp...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2160952</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2160952</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Sun, 25 Dec 2011 23:22:49 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton static und lazy creation on Mon, 26 Dec 2011 00:10:03 GMT]]></title><description><![CDATA[<p>Ich würde das als &quot;lazy initialization&quot; bezeichnen - der Sinn ist aber der selbe.<br />
Deutsche Übersetzung kenne ich keine. Bin aber auch kein Fan von &quot;alles muss übersetzt werden&quot;. &quot;Lazy initialization&quot; heisst eben &quot;lazy initialization&quot; - das muss reichen.</p>
<p>Ich weiss nicht ob definiert ist, wie der Speicher reserviert wird. Ich kenne aber keine Implementierung wo der Speicher dynamisch reserviert werden würde.</p>
<p>Die Initialisierung findet dann beim ersten Aufruf statt. Das schliesst sowohl den Aufruf des Konstruktors mit ein, als auch die Auswertung diverser Ausdrücke die für die Initialisierung gebraucht werden.<br />
Und zwar unabhängig davon ob der Typ ein eingebauter Typ ala &quot;int&quot; ist oder eine selbst definierte Klasse. Beispiel:</p>
<pre><code class="language-cpp">#include &lt;time.h&gt;
#include &lt;iostream&gt;

void foo()
{
    static time_t t1 = time(0);
    std::cout &lt;&lt; t1 &lt;&lt; &quot;\n&quot;;
}

int main()
{
    time_t t0 = time(0);
    std::cout &lt;&lt; t0 &lt;&lt; &quot;\n&quot;;
    sleep(2); // Windows: Sleep(2000);
    foo();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2160967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2160967</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 26 Dec 2011 00:10:03 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton static und lazy creation on Mon, 26 Dec 2011 11:14:49 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Ich kenne aber keine Implementierung wo der Speicher dynamisch reserviert werden würde.</p>
</blockquote>
<p>Also ich würde da, wenn ich es nicht explizit analysieren würde, keinen Unterschied merken. Deswegen frage ich mich gerade: Woher weißt du sowas? :xmas1:</p>
<p>Gruß,<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2161011</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161011</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Mon, 26 Dec 2011 11:14:49 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton static und lazy creation on Tue, 27 Dec 2011 08:49:12 GMT]]></title><description><![CDATA[<p>Martin Kalbfuß schrieb:</p>
<blockquote>
<p>Hallo Leuts,</p>
<p>type &amp;singleton()<br />
{<br />
static type instance;<br />
return instance;<br />
}</p>
<p>Handelt es sich hierbei um &quot;lazy creation&quot;?</p>
</blockquote>
<p>Nein handelt es nicht, sondern so:</p>
<pre><code class="language-cpp">/// Based on Andrei Alexandrescu's idea from the book &quot;Modern C++ Design&quot; 
class CLazyObject
{
protected:

  /**
   * Need to be friend with UserClassT
   */
  template &lt;class UserClassT&gt;
  static void create( UserClassT*&amp; _ptr ) 
  {  
    _ptr = new UserClassT;
	static boost::scoped_ptr&lt;UserClassT&gt; destroyer(_ptr);  
  }
};

///
template &lt; class UserClassT, 
		   class Lock=CDummyMutex,
           class InstancePolicy=CLazyObject
         &gt;
class CSingletonT : private InstancePolicy, private boost::noncopyable
{
public:

  typedef InstancePolicy InstantiationPolicyT;
  typedef Lock            LockT;

  /// \brief Access to instance.
  ///
  /// Provide access to the single instance through double-checked locking 
  ///
  /// \return T* single instance 
  ///
  static UserClassT* instance()
  {
    // Uses local static storage to avoid static construction
    // sequence issues. (regaring when the lock is created)
    static UserClassT* ptr = 0;    
    static LockT lock;

    if(!ptr) 
    {
      lock.lock();
      if(!ptr)        
        InstancePolicy::create(ptr);
	  lock.unlock();
    }   
    return const_cast&lt;UserClassT*&gt;(ptr);    
  }
};
</code></pre>
<p>Hab ich jetzt mal aus unserer Game-Engine kopiert.<br />
Alternativ <a href="http://loki-lib.cvs.sourceforge.net/loki-lib/loki/include/loki/Singleton.h?view=markup" rel="nofollow">gibts die Version von Alexandrescu</a>.</p>
<p>Die Instanziierung via Template-Policy erlaubt beliebige Erzeugungsroutinen einzubinden.<br />
Für den normalen Hausgebrauch nutzt man meistens:</p>
<pre><code class="language-cpp">if(!ptr)
    ptr = new UserClassT;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2161216</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161216</guid><dc:creator><![CDATA[nurf]]></dc:creator><pubDate>Tue, 27 Dec 2011 08:49:12 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton static und lazy creation on Tue, 27 Dec 2011 12:45:56 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18674">@nurf</a>: Dein Code ist nicht Exception-sicher</p>
<pre><code class="language-cpp">if(!ptr)
    {
      lock.lock();
      if(!ptr)        
        InstancePolicy::create(ptr);
      lock.unlock();
    }
</code></pre>
<p>Wenn InstancePolicy::create() eine exception wirft, ist das lock gesetzt und wird nie wieder freigegeben. Besser wäre es ein Lock(lock) (s. Alexandrescu) zu verwenden, dass das lock im Destruktor frei gibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2161256</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161256</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Tue, 27 Dec 2011 12:45:56 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton static und lazy creation on Tue, 27 Dec 2011 14:06:12 GMT]]></title><description><![CDATA[<p>ogni42 schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18674">@nurf</a>: Dein Code ist nicht Exception-sicher</p>
</blockquote>
<p>Danke für den Hinweis! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2161273</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161273</guid><dc:creator><![CDATA[nurf]]></dc:creator><pubDate>Tue, 27 Dec 2011 14:06:12 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton static und lazy creation on Tue, 27 Dec 2011 16:36:40 GMT]]></title><description><![CDATA[<p>nurf schrieb:</p>
<blockquote>
<p>Martin Kalbfuß schrieb:</p>
<blockquote>
<p>Hallo Leuts,</p>
<p>type &amp;singleton()<br />
{<br />
static type instance;<br />
return instance;<br />
}</p>
<p>Handelt es sich hierbei um &quot;lazy creation&quot;?</p>
</blockquote>
<p>Nein handelt es nicht</p>
</blockquote>
<p>Ich behaupte weiterhin das Gegenteil.</p>
<p>&quot;instance&quot; wird hier erst erzeugt, wenn singleton() das erste mal aufgerufen wird. Ich nenne das lazy creation bzw. eben lazy initialization.</p>
<p>Wenn du meinst das wäre nicht so, argumentiere es bitte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2161322</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161322</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 27 Dec 2011 16:36:40 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton static und lazy creation on Tue, 27 Dec 2011 16:38:11 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Ich behaupte weiterhin das Gegenteil.</p>
<p>&quot;instance&quot; wird hier erst erzeugt, wenn singleton() das erste mal aufgerufen wird. Ich nenne das lazy creation bzw. eben lazy initialization.</p>
</blockquote>
<p>Sehe ich auch so...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2161323</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161323</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Tue, 27 Dec 2011 16:38:11 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton static und lazy creation on Tue, 27 Dec 2011 17:07:40 GMT]]></title><description><![CDATA[<p>im alexandrescu wird das ausführlich diskutiert, wenn gewünscht suche ich gleich die seite raus und zitiere das mal, aber hier ist der sinn den er beschreibt</p>
<p>statische variablen werden am anfang des programms erzeugt, aber erst bei der ersten benutzung initialisiert. das heisst der compiler reserviert schon den speicher und teilt den zu, aber bereit für die nutzung ist es erst wenn es laut quellcode erzuegt wird, sprich eben in der zeile &quot;static Singleton singleton;&quot;</p>
<p>und da gibts auch probleme beim initialisieren, wenn nämlich mehrere singletons unternander abhängig sind und sich gegenseitig brauchen zum initialisieren. da bei statischen variablen die initialisierungs reihenfolge nicht festgelegt ist...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2161326</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161326</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Tue, 27 Dec 2011 17:07:40 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton static und lazy creation on Tue, 27 Dec 2011 17:27:21 GMT]]></title><description><![CDATA[<p>Also wann der Speicher reserviert wird, spielt aus meiner Sicht mal keine Rolle.</p>
<p>Und Probleme mit der Initialisierungsreihenfolge bekommt man mit function-static Variablen nicht mehr oder weniger als mit der static Pointer + new Methode.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2161329</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161329</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 27 Dec 2011 17:27:21 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton static und lazy creation on Tue, 27 Dec 2011 17:49:37 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">type&amp; singleton() 
{ 
  static std::unique_ptr&lt;type&gt; instance(new type());
  return *instance;
}
</code></pre>
<p>Und schon wird der Speicher dynamisch reserviert, wobei ich die statische Allokation der ursprünglichen Variante eigentlich eher als Vorteil denn als Nachteil sehen würde.</p>
<p>Ich würd das Ding übrigens nicht unbedingt singleton nennen, denn am Ende verwechselt es noch einer mit dem Singleton Pattern. Auch ist es natürlich von den üblichen Nachteilen globaler Variablen betroffen, weshalb ich von sowas grundsätzlich eher abraten würde, ganz egal wie die konkrete Implementierung am Ende auch aussehen mag...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2161330</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161330</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Tue, 27 Dec 2011 17:49:37 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton static und lazy creation on Tue, 27 Dec 2011 18:58:04 GMT]]></title><description><![CDATA[<p>Super Danke für die hilfreichen Antworten. Ich habe es eigentlich nur Singleton genannt, weil mir kein besserer Name eingefallen ist. Gibt es denn einen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2161347</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161347</guid><dc:creator><![CDATA[Martin Kalbfuß]]></dc:creator><pubDate>Tue, 27 Dec 2011 18:58:04 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton static und lazy creation on Tue, 27 Dec 2011 20:30:49 GMT]]></title><description><![CDATA[<p>Lazy Creation scheint normal zu sein.</p>
<p>Input:</p>
<pre><code class="language-cpp">#include &lt;string&gt;
#include &lt;cstdio&gt;

void test()
{
   static std::string foo = &quot;foo&quot;;
   foo += &quot;o&quot;;
   puts(foo.c_str());
}

int main()
{
   for(int i = 0; i &lt; 10; ++i)
      test();
}
</code></pre>
<p>GCC macht daraus:</p>
<pre><code class="language-asm">0x08048784 &lt;+0&gt;:	push   %ebp
   0x08048785 &lt;+1&gt;:	mov    %esp,%ebp
   0x08048787 &lt;+3&gt;:	push   %esi
   0x08048788 &lt;+4&gt;:	push   %ebx
   0x08048789 &lt;+5&gt;:	sub    $0x20,%esp
   0x0804878c &lt;+8&gt;:	mov    $0x804a050,%eax
   0x08048791 &lt;+13&gt;:	movzbl (%eax),%eax
   0x08048794 &lt;+16&gt;:	test   %al,%al
   0x08048796 &lt;+18&gt;:	jne    0x804880c &lt;_Z4testv+136&gt;
   0x08048798 &lt;+20&gt;:	movl   $0x804a050,(%esp)
   0x0804879f &lt;+27&gt;:	call   0x8048600 &lt;__cxa_guard_acquire@plt&gt;
   0x080487a4 &lt;+32&gt;:	test   %eax,%eax
   0x080487a6 &lt;+34&gt;:	setne  %al
   0x080487a9 &lt;+37&gt;:	test   %al,%al
   0x080487ab &lt;+39&gt;:	je     0x804880c &lt;_Z4testv+136&gt;
   0x080487ad &lt;+41&gt;:	mov    $0x0,%ebx
   0x080487b2 &lt;+46&gt;:	lea    -0x9(%ebp),%eax
   0x080487b5 &lt;+49&gt;:	mov    %eax,(%esp)
   0x080487b8 &lt;+52&gt;:	call   0x80486a0 &lt;_ZNSaIcEC1Ev@plt&gt;
   0x080487bd &lt;+57&gt;:	lea    -0x9(%ebp),%eax
   0x080487c0 &lt;+60&gt;:	mov    %eax,0x8(%esp)
   0x080487c4 &lt;+64&gt;:	movl   $0x8048970,0x4(%esp)
   0x080487cc &lt;+72&gt;:	movl   $0x804a058,(%esp)
   0x080487d3 &lt;+79&gt;:	call   0x8048660 &lt;_ZNSsC1EPKcRKSaIcE@plt&gt;
   0x080487d8 &lt;+84&gt;:	movl   $0x804a050,(%esp)
   0x080487df &lt;+91&gt;:	call   0x8048650 &lt;__cxa_guard_release@plt&gt;
   0x080487e4 &lt;+96&gt;:	mov    $0x8048640,%eax
   0x080487e9 &lt;+101&gt;:	movl   $0x804a040,0x8(%esp)
   0x080487f1 &lt;+109&gt;:	movl   $0x804a058,0x4(%esp)
   0x080487f9 &lt;+117&gt;:	mov    %eax,(%esp)
   0x080487fc &lt;+120&gt;:	call   0x80485f0 &lt;__cxa_atexit@plt&gt;
   0x08048801 &lt;+125&gt;:	lea    -0x9(%ebp),%eax
   0x08048804 &lt;+128&gt;:	mov    %eax,(%esp)
   0x08048807 &lt;+131&gt;:	call   0x8048670 &lt;_ZNSaIcED1Ev@plt&gt;
   0x0804880c &lt;+136&gt;:	movl   $0x8048974,0x4(%esp)
   0x08048814 &lt;+144&gt;:	movl   $0x804a058,(%esp)
   0x0804881b &lt;+151&gt;:	call   0x80485e0 &lt;_ZNSspLEPKc@plt&gt;
   0x08048820 &lt;+156&gt;:	movl   $0x804a058,(%esp)
   0x08048827 &lt;+163&gt;:	call   0x8048620 &lt;_ZNKSs5c_strEv@plt&gt;
   0x0804882c &lt;+168&gt;:	mov    %eax,(%esp)
   0x0804882f &lt;+171&gt;:	call   0x8048680 &lt;puts@plt&gt;
   0x08048834 &lt;+176&gt;:	add    $0x20,%esp
   0x08048837 &lt;+179&gt;:	pop    %ebx
   0x08048838 &lt;+180&gt;:	pop    %esi
   0x08048839 &lt;+181&gt;:	pop    %ebp
   0x0804883a &lt;+182&gt;:	ret    
   0x0804883b &lt;+183&gt;:	mov    %eax,%esi
   0x0804883d &lt;+185&gt;:	lea    -0x9(%ebp),%eax
   0x08048840 &lt;+188&gt;:	mov    %eax,(%esp)
   0x08048843 &lt;+191&gt;:	call   0x8048670 &lt;_ZNSaIcED1Ev@plt&gt;
   0x08048848 &lt;+196&gt;:	test   %bl,%bl
   0x0804884a &lt;+198&gt;:	jne    0x8048858 &lt;_Z4testv+212&gt;
   0x0804884c &lt;+200&gt;:	movl   $0x804a050,(%esp)
   0x08048853 &lt;+207&gt;:	call   0x8048690 &lt;__cxa_guard_abort@plt&gt;
   0x08048858 &lt;+212&gt;:	mov    %esi,%eax
   0x0804885a &lt;+214&gt;:	mov    %eax,(%esp)
   0x0804885d &lt;+217&gt;:	call   0x80486c0 &lt;_Unwind_Resume@plt&gt;
</code></pre>
<p>Was frei von IDA Pro + Hex Rays nach C konvertiert so aussieht:</p>
<pre><code class="language-cpp">int __cdecl test()
{
  const char *v0; // eax@4
  char v2; // [sp+1Fh] [bp-9h]@3

  if ( !(_BYTE)_guard_variable_for_test_void_::foo &amp;&amp; __cxa_guard_acquire(&amp;_guard_variable_for_test_void_::foo) != 0 )
  {
    std::allocator&lt;char&gt;::allocator(&amp;v2);
    std::string::string(&amp;test_void_::foo, &amp;unk_8048970, &amp;v2);
    __cxa_guard_release(&amp;_guard_variable_for_test_void_::foo);
    __cxa_atexit(std::string::_string, &amp;test_void_::foo, &amp;_dso_handle);
    std::allocator&lt;char&gt;::_allocator(&amp;v2);
  }
  std::string::operator__(&amp;test_void_::foo, &amp;unk_8048974);
  v0 = (const char *)std::string::c_str(&amp;test_void_::foo);
  return puts(v0);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2161370</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161370</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Tue, 27 Dec 2011 20:30:49 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton static und lazy creation on Wed, 28 Dec 2011 01:34:42 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/26744">@Ethon</a><br />
Ich verstehe nicht ganz was du meinst bzw. uns sagen willst.</p>
<p>Lazy-Creation im Sinne von &quot;Konstruktor wird erst beim ersten Funktionsaufruf ausgeführt&quot; ist bei function-statics nicht nur normal, sondern vom Standard vorgeschrieben.</p>
<p>Was die Speicher-Allokation für das Objekt selbst angeht, so ist diese in dem von dir gezeigten Code statisch: der &quot;this&quot; Pointer des <code>std::string</code> ist im nach (fast-) C zurückübersetzten Code <code>&amp;test_void_::foo</code> , also statisch. Das Speicher-Besorgen selbst ist als nicht &quot;lazy&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2161435</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161435</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 28 Dec 2011 01:34:42 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton static und lazy creation on Wed, 28 Dec 2011 01:46:01 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<pre><code class="language-cpp">type&amp; singleton() 
{ 
  static std::unique_ptr&lt;type&gt; instance(new type());
  return *instance;
}
</code></pre>
<p>[...]<br />
Ich würd das Ding übrigens nicht unbedingt singleton nennen, denn am Ende verwechselt es noch einer mit dem Singleton Pattern.</p>
</blockquote>
<p>Das <em>ist</em> das Singleton-Pattern.<br />
Bzw. so knapp dran, dass ich keinen nennenswerten Unterschied sehe.<br />
Das einzige was hier nicht dem Singleton-Pattern entspricht (bzw. vielleicht - wir sehen zu wenig Code um das sicher sagen zu können) ist, dass die Klasse sich nicht selbst &quot;schützt&quot; und zum Singleton macht.</p>
<p>Was Vor-/Nachteile angeht ist das IMO aber nicht wirklich wichtig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2161437</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161437</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 28 Dec 2011 01:46:01 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton static und lazy creation on Wed, 28 Dec 2011 02:04:21 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>dot schrieb:</p>
<blockquote>
<pre><code class="language-cpp">type&amp; singleton() 
{ 
  static std::unique_ptr&lt;type&gt; instance(new type());
  return *instance;
}
</code></pre>
<p>[...]<br />
Ich würd das Ding übrigens nicht unbedingt singleton nennen, denn am Ende verwechselt es noch einer mit dem Singleton Pattern.</p>
</blockquote>
<p>Das <em>ist</em> das Singleton-Pattern.<br />
Bzw. so knapp dran, dass ich keinen nennenswerten Unterschied sehe.<br />
Das einzige was hier nicht dem Singleton-Pattern entspricht (bzw. vielleicht - wir sehen zu wenig Code um das sicher sagen zu können) ist, dass die Klasse sich nicht selbst &quot;schützt&quot; und zum Singleton macht.</p>
</blockquote>
<p>Die Tatsache dass der Typ gegen Mehfachinstanzierung geschützt wird, ist doch <em>die eine</em> Eigenschaft die ein Singleton ausmacht!? Alles andere (globaler Zugriff auf die Instanz) ist nur Konsequenz einer konkreten Inkarnation des Pattern, nicht aber der Zweck des Singleton Pattern. Das da oben ist in etwa so orthogonal zum Singleton Pattern wie eine globale Variable...</p>
<p>EDIT: Natürlich gehe ich davon aus dass der Typ nicht geschützt ist. Du hast recht dass man das, basierend auf dem Codeschnipsel, nicht gesichert sagen kann, es ist aber imo ziemlich sicher anzunehmen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2161438</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161438</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Wed, 28 Dec 2011 02:04:21 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton static und lazy creation on Wed, 28 Dec 2011 11:45:14 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Was die Speicher-Allokation für das Objekt selbst angeht, so ist diese in dem von dir gezeigten Code statisch: der &quot;this&quot; Pointer des <code>std::string</code> ist im nach (fast-) C zurückübersetzten Code <code>&amp;test_void_::foo</code> , also statisch. Das Speicher-Besorgen selbst ist als nicht &quot;lazy&quot;.</p>
</blockquote>
<p>Natürlich landet das in .data/.rdata, anders wäre das ja auch unmöglich umzusetzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2161489</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161489</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Wed, 28 Dec 2011 11:45:14 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton static und lazy creation on Wed, 28 Dec 2011 14:55:42 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/26744">@Ethon</a>/Hustbaer:<br />
Im von Ethon geposteten assembler listing sind ja schon Mutexe für die Konstruktion drin.</p>
<p>Macht das speziell nur der gcc oder gilt das z.B. auch bei VC++ (im multithreaded Modell)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2161534</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161534</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 28 Dec 2011 14:55:42 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton static und lazy creation on Thu, 29 Dec 2011 17:36:12 GMT]]></title><description><![CDATA[<p>Naja, <em>nur</em> GCC will ich jetzt nicht sagen, gibt ja viele Compiler.<br />
MSVC bis inklusive 2010 macht es allerdings <em>nicht</em>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2161903</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161903</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 29 Dec 2011 17:36:12 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton static und lazy creation on Thu, 29 Dec 2011 18:35:29 GMT]]></title><description><![CDATA[<p>dot schrieb:</p>
<blockquote>
<p>Die Tatsache dass der Typ gegen Mehfachinstanzierung geschützt wird, ist doch <em>die eine</em> Eigenschaft die ein Singleton ausmacht!?</p>
</blockquote>
<p>Sehe ich jetzt nicht so.<br />
Wenn ich einen Typ T habe, den man ganz normal instanzieren kann. Und aber eine T Instanz mit spezieller Bedeutung haben kann, die es nur 1x geben kann... es aber trotzdem Sinn macht andere Ts normal zu erzeugen...<br />
Dann werde ich den Konstruktor von T nicht private machen, und eine &quot;get the ony special T instance&quot; Funktion machen.<br />
Was für praktisch relevante Unterschiede gibt es da dann zu einem Singleton?<br />
Für mich ist das einfach das selbe.</p>
<p>Der Knackpunkt beim Singleton Pattern ist für mich einfach, dass man ein Objekt (nicht eine Klasse) zum Singleton erklärt. Mit all den Vor- und Nachteilen die sich daraus ergeben.</p>
<p>Für mich besteht auch kein wesentlicher Unterschied zwischen z.B. privaten static Members und Singletons.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2161907</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161907</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 29 Dec 2011 18:35:29 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton static und lazy creation on Thu, 29 Dec 2011 18:44:45 GMT]]></title><description><![CDATA[<p>Was ist überhaupt der Sinn des Singlwton-Patterns? Wieso keine freien Funktionen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2161927</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161927</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Thu, 29 Dec 2011 18:44:45 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton static und lazy creation on Thu, 29 Dec 2011 18:52:23 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Naja, nur GCC will ich jetzt nicht sagen, gibt ja viele Compiler.<br />
MSVC bis inklusive 2010 macht es allerdings nicht.</p>
</blockquote>
<p>Was bedeutet das denn für den Konstruktoraufruf in dem Fall? Ist der dann nicht mehr thread-safe?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2161930</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161930</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 29 Dec 2011 18:52:23 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton static und lazy creation on Thu, 29 Dec 2011 20:16:33 GMT]]></title><description><![CDATA[<p>Ethon schrieb:</p>
<blockquote>
<p>Was ist überhaupt der Sinn des Singlwton-Patterns? Wieso keine freien Funktionen?</p>
</blockquote>
<p>Die Vorteile des Singleton-Pattern:</p>
<p>- Man kann sich wie ein OOPer fühlen, während man globale Variablen und Funktionen mit Seiteneffekten benutzt.<br />
- Es lässt sich praktisch in jedem Programm anwenden.<br />
- Es muss gut sein, steht schließlich &quot;Pattern&quot; dran.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2161953</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161953</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Thu, 29 Dec 2011 20:16:33 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton static und lazy creation on Thu, 29 Dec 2011 20:07:01 GMT]]></title><description><![CDATA[<p>ogni42 schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Naja, nur GCC will ich jetzt nicht sagen, gibt ja viele Compiler.<br />
MSVC bis inklusive 2010 macht es allerdings nicht.</p>
</blockquote>
<p>Was bedeutet das denn für den Konstruktoraufruf in dem Fall? Ist der dann nicht mehr thread-safe?</p>
</blockquote>
<p>Genau, die Initialisierung von function-statics ist mit MSVC nicht threadsafe.</p>
<p>D.h. wenn man nen Fall hat, wo man nicht garantieren kann, dass die Funktion vollständig ausgeführt wurde, bevor man Threads startet die die selbe Funktion aufrufen, dann kann das in UB enden.</p>
<p>Ich hoffe dass MS da beim 2012er Studio mal nachbessert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2161968</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161968</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 29 Dec 2011 20:07:01 GMT</pubDate></item><item><title><![CDATA[Reply to Singleton static und lazy creation on Thu, 29 Dec 2011 20:17:01 GMT]]></title><description><![CDATA[<p>Was nebenbei bedeutet, dass nurfs Version auch nicht threadsafe ist (selbst wenn man davon ausgeht, dass die richtige release-aquire-Semantik für ptr gilt und Instruktion nicht zu sehr umgeordnet werden). Das Mutex-Objekt wird dort nämlich auch funktionslokal erzeugt. Und dessen Konstruktion dürfte eher nicht trivial sein. Für solche Zwecke muss ganz klar ein globaler Mutex her, der garantiert bereits konstruiert wurde oder man behilft sich mit einem Eigenbau, der auch mit Zeroinitialisierung noch richtig funktioniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2161975</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161975</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 29 Dec 2011 20:17:01 GMT</pubDate></item></channel></rss>