<?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[Wann ist ein object statically initializable?]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe gerade den Artikel in Evelissimo's<br />
Footer gelesen (<a href="http://uint32t.blogspot.com/2007/12/you-lazy-bastard-part-1.html" rel="nofollow">http://uint32t.blogspot.com/2007/12/you-lazy-bastard-part-1.html</a>).<br />
Dort steht dass boost mutex nicht statically initializable sind.<br />
Jetzt frag ich mich, welche Bedingungen müssen dafür erfüllt sein?<br />
Meine einzige Erklärung, wann etwas schief gehen könnte wäre, wenn ein Objekt<br />
aus einem statischen Kontext erzeugt wird und dieses auf andere statische<br />
Objekte zugreift. Da es keine Reihenfolgedefinition gibt, könnten diese anderen<br />
statischen Objekte noch nicht erzeugt worden sein.<br />
Liege ich da richtig oder gibt es noch andere Kriterien?</p>
<p>Gruß,<br />
Braun-Bär Bruno</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/265410/wann-ist-ein-object-statically-initializable</link><generator>RSS for Node</generator><lastBuildDate>Fri, 04 Sep 2026 07:36:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/265410.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 22 Apr 2010 14:54:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wann ist ein object statically initializable? on Thu, 22 Apr 2010 14:54:25 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe gerade den Artikel in Evelissimo's<br />
Footer gelesen (<a href="http://uint32t.blogspot.com/2007/12/you-lazy-bastard-part-1.html" rel="nofollow">http://uint32t.blogspot.com/2007/12/you-lazy-bastard-part-1.html</a>).<br />
Dort steht dass boost mutex nicht statically initializable sind.<br />
Jetzt frag ich mich, welche Bedingungen müssen dafür erfüllt sein?<br />
Meine einzige Erklärung, wann etwas schief gehen könnte wäre, wenn ein Objekt<br />
aus einem statischen Kontext erzeugt wird und dieses auf andere statische<br />
Objekte zugreift. Da es keine Reihenfolgedefinition gibt, könnten diese anderen<br />
statischen Objekte noch nicht erzeugt worden sein.<br />
Liege ich da richtig oder gibt es noch andere Kriterien?</p>
<p>Gruß,<br />
Braun-Bär Bruno</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1886802</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1886802</guid><dc:creator><![CDATA[Braun-Bär Bruno]]></dc:creator><pubDate>Thu, 22 Apr 2010 14:54:25 GMT</pubDate></item><item><title><![CDATA[Reply to Wann ist ein object statically initializable? on Thu, 22 Apr 2010 15:04:53 GMT]]></title><description><![CDATA[<blockquote>
<p>Or &quot;Portable, thread-safe, lazily initialized singletons with Boost.&quot;</p>
</blockquote>
<p>Hier dachte ich mir: OMFG.</p>
<blockquote>
<p>Portable, efficient, lazily initialized thread-safe singletons are something that are needed fairly often in the C++ wild.</p>
</blockquote>
<p>Bis hier hin bin ich gekommen und habe aufgehoert zu lesen.</p>
<p>Ich weiss, es hilft dir nicht viel.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1886804</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1886804</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Thu, 22 Apr 2010 15:04:53 GMT</pubDate></item><item><title><![CDATA[Reply to Wann ist ein object statically initializable? on Thu, 22 Apr 2010 15:11:44 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<blockquote>
<p>Or &quot;Portable, thread-safe, lazily initialized singletons with Boost.&quot;</p>
</blockquote>
<p>Hier dachte ich mir: OMFG.</p>
<blockquote>
<p>Portable, efficient, lazily initialized thread-safe singletons are something that are needed fairly often in the C++ wild.</p>
</blockquote>
<p>Bis hier hin bin ich gekommen und habe aufgehoert zu lesen.</p>
</blockquote>
<p>Ein total sinnloses Statement, solange du nicht dazu schreibst was genau dir da nicht passt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1886813</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1886813</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 22 Apr 2010 15:11:44 GMT</pubDate></item><item><title><![CDATA[Reply to Wann ist ein object statically initializable? on Thu, 22 Apr 2010 15:27:24 GMT]]></title><description><![CDATA[<p>Allein die Tatsache, dass man Singletons haeufig benoetigt, ist eine unhaltbare Behauptung. Wir wissen alle um das Pro und Contra. Wie viele Programmierer darauf verzichten, weiss ich nicht zu sagen, aber das es als Objekt gebraucht wird, widerspricht meiner Erfahrung. Es gibt Mittel es zu umgehen. Das Ganze auf Multithreaded auszudehnen und &quot;fairly often&quot; und in &quot;the wild&quot; dazuzuschreiben macht es nicht besser. Ich bemuehe mich durch geeignete Programmierung, dass die Frage, was wird denn nun zuerst initialisiert, gar nicht erst gestellt werden muss. Und wann braucht man solche Objekte &quot;lazy&quot;? &quot;Fairly often&quot; und &quot;in the wild&quot; bestimmt nicht. Es liesst sich einfach als eine Aneinandereihung von Buzzwords.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1886818</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1886818</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Thu, 22 Apr 2010 15:27:24 GMT</pubDate></item><item><title><![CDATA[Reply to Wann ist ein object statically initializable? on Thu, 22 Apr 2010 15:30:17 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>Allein die Tatsache, dass man Singletons haeufig benoetigt</p>
</blockquote>
<p>Du liest nicht, du schaust nur Worte an.</p>
<p>Singletons braucht man. Wenn du nur einmal in deinem Leben einen Singleton brauchst, solltest du das den Artikel lesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1886828</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1886828</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Thu, 22 Apr 2010 15:30:17 GMT</pubDate></item><item><title><![CDATA[Reply to Wann ist ein object statically initializable? on Thu, 22 Apr 2010 15:55:38 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Du liest nicht, du schaust nur Worte an.</p>
</blockquote>
<p>Stimmt, habe ihn jetzt gelesen. Ich kann nicht sagen, wann ein Objekt statisch initializierbar ist, aber ich kann sagen, warum Mutex es nicht ist. Ganz einfach: Es ist eine Betriebssystemresource die ueber einen Funktionsaufruf angefordert/initialisiert wird. Ob dieser vor oder nach der Initialisierung des Singletons beim Programmstart passiert, ist ungewiss. Deswegen sind wohl nur &quot;primitive&quot; Datentypen statisch initialisierbar, bei denen nichts wirklich spannendes im Konstruktor (Initialisierungsliste) passiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1886844</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1886844</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Thu, 22 Apr 2010 15:55:38 GMT</pubDate></item><item><title><![CDATA[Reply to Wann ist ein object statically initializable? on Thu, 22 Apr 2010 18:16:30 GMT]]></title><description><![CDATA[<p>Hallo nochmal,</p>
<p>wenn ihr multithreaded-Singletons benötigt,<br />
löst ihr das auch mit<br />
boost::call_once oder wie macht ihr das?<br />
Also ich glaube wenn ich vor dem Problem stünde, würde ich ganz zu<br />
Beginn in main eine Initialisierungsfunktion aufrufen, die mir ein statisches<br />
Mutex-Objekt auf dem Heap erstellt. Initial ist der Zeiger auf dieses Objekt 0.<br />
Über diesen Mutex würde ich dann nach Aufruf der Initialisierungsfunktion alle</p>
<pre><code class="language-cpp">initSingletonMutex(); // tut nur etwas wenn der Zeiger == 0 ist
scoped_lock lock(*globalSingletonMutex);
</code></pre>
<p>Singletons erstellen.<br />
Der zusätzliche Aufruf von initSingletonMutex(); hat den Zweck, dass<br />
auch in einem statischen Kontext auf den Singleton zugegriffen werden kann.<br />
Alle Aufrufe von statischen Funktionen &amp; Konstruktoren vor main geschehen doch<br />
(garantiert?) singlethreaded, oder? Man sollte natürlich keinen zusätzlichen<br />
Thread statisch, sondern nur indirekt über main, starten. Klar, dass es dann in die Fritten gehen kann.</p>
<p>Gruß,<br />
Braun-Bär Bruno</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1886915</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1886915</guid><dc:creator><![CDATA[Braun-Bär Bruno]]></dc:creator><pubDate>Thu, 22 Apr 2010 18:16:30 GMT</pubDate></item><item><title><![CDATA[Reply to Wann ist ein object statically initializable? on Thu, 22 Apr 2010 18:55:41 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/21632">@knivil</a>:<br />
Die Ausdehnung auf &quot;multi-threaded&quot; ist vermutlich deswegen da (und IMO sinnvoll), weil es<br />
a) ohne &quot;multi-threaded&quot; kein schwieriges Problem ist und<br />
b) die meisten Libraries &quot;multi-threaded&quot; Clients unterstützen sollten</p>
<p>Programmierst du also eine Library die für den Einsatz in beliebigen Projekten gedacht ist (denk z.B. an die Boost Libraries), dann musst du entweder auf Singletons verzichten, oder sie thread-safe initialisieren. Alles andere ist Murks.</p>
<p>Verzichten ist nun aber oft doof. Denk an Fälle wo du bestimmte vorberechnete Daten hast, Lookup Tables für Hashberechnungen z.B. Sowas ohne Singleton zu machen halte ich für Verschwendung. Bzw. auch andere Dinge. Pooling von diversen aufwendig zu erzeugenden oder zerstörenden Objekten. Tracking von Instanzen (z.B. zu debugging Zwecken). Logging.</p>
<p>Also doch Singletons für bestimmte Dinge. Diese nun beim Programmstart zu initialisieren löst zwar das Initialisierungsproblem, dafür hat es andere Nachteile.<br />
Zum einen kann man dann die Funktionen die diese Daten benötigen in der Initialisierungsphase nicht verwenden, da keine Reihenfolge garantiert ist. Kann man natürlich wieder über eine Init-Funktion lösen, nur Init-Funktionen sind IMO ganz schlimm pfui (auf die Gründe will ich nicht näher eingehen, das würde etwas zu weit führen).<br />
Und zum anderen entspricht es oft nicht dem &quot;nur für das zahlen was man verwendet&quot; Prinzip. Was wenn die Initialisierung teuer ist (viel CPU Zeit oder RAM benötigt)? Was wenn der User der Library aber nur einen kleinen Teil der Library verwendet, der das Singleton gar nicht braucht?</p>
<p>Und so landen wir beim thread-safe lazy initialized singleton. Ist nicht etwas was jeder C++ Entwickler jede Woche mal braucht, aber für bestimmte Gruppen von Programmierern, u.a. Library-Entwickler, ist es etwas wo man ab und an mal froh wäre eine gute Lösung zu haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1886931</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1886931</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 22 Apr 2010 18:55:41 GMT</pubDate></item><item><title><![CDATA[Reply to Wann ist ein object statically initializable? on Thu, 22 Apr 2010 19:14:25 GMT]]></title><description><![CDATA[<p>@Braun-Bär Bruno:<br />
Ich verwende boost::call_once für sowas, ja.</p>
<p>Keine Ahnung wie schnell oder langsam boost::call_once mit PTHREADS ist, aber wenn die Jungs nicht ganz gepennt haben gibt es da kein Problem.</p>
<p>Die Implementierung für Windows ist auf jedem Fall ab dem 2. Aufruf wieselflink, schneller geht's nicht (genau 1 Interlocked Befehl + Kleingeld). Der erste Aufruf ist dafür - relativ - teuer. Absolut gesehen nichts aufregendes, aber es wird immerhin aus der Prozess-ID + einer GUID ein eindeutiger Name für eine Mutex gebastelt, dann eine benannte Win32-Mutex mit CreateMutex angelegt, und diese gelockt. CreateMutex, WaitForSingleObject und ReleaseMutex sind alles Kernel-Calls, und damit ziemlich lahm. Also verglichen mit 1x InterlockedCompareExchange.</p>
<p>Ich hatte allerdings noch nie einen Fall, wo diese (absolut betrachtet minimalen) Kosten des 1. Aufruf derart wichtig gewesen wären, dass man nicht direkt boost::call_once hätte verwenden können.</p>
<p>p.S.: bevor ich dem Client eine Init-Funktion aufzwinge, löse ich das lieber über &quot;simple&quot; Spin-Locks (mit Backoff). Dafür reicht unter Windows ein <code>volatile LONG</code> , welches man auch super statisch initialisieren kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1886934</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1886934</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 22 Apr 2010 19:14:25 GMT</pubDate></item><item><title><![CDATA[Reply to Wann ist ein object statically initializable? on Thu, 22 Apr 2010 19:11:13 GMT]]></title><description><![CDATA[<p>BTW: folgender Absatz</p>
<blockquote>
<p>Now we did drop efficiency, and that makes you very very sad, Mr Premature Optimizer. There is good news and bad news. The bad news is that the Boost Thread implementation of boost::call_once is slow on Windows. The good news is that it is fast on everything else.</p>
</blockquote>
<p>ist Bullshit.<br />
Wie erwähnt kostet boost::call_once unter Windows ab dem 2. Aufruf genau 1x InterlockedCompareExchange. Schneller geht's nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1886942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1886942</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 22 Apr 2010 19:11:13 GMT</pubDate></item></channel></rss>