<?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[Länge einer Stringkonstante zur Übersetzungszeit ermitteln]]></title><description><![CDATA[<p>Hallo,</p>
<p>In &quot;Mr. STLs&quot; letztem Video <a href="http://channel9.msdn.com/Shows/Going+Deep/C9-Lectures-Stephan-T-Lavavej-Standard-Template-Library-STL-10-of-10" rel="nofollow">http://channel9.msdn.com/Shows/Going+Deep/C9-Lectures-Stephan-T-Lavavej-Standard-Template-Library-STL-10-of-10</a><br />
fand ich wieder einmal wertvolles Grundwissen, das - warum auch immer - mir bisher nie untergekommen war: Das Auflösen eines nativen C-Array-Types per Template</p>
<p>template&lt;class T, size_t N&gt; void foo(T const (&amp;a)[N]) { ... }</p>
<p>Die Methode finde ich äußerst praktisch für das Initialisieren von String- und Array-Klassen.<br />
Es hat mich immer schon etwas gestört, dass beim Erzeugen von std::string aus einem (char const <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="😉"
    /> intern nochmals eine strlen Implementierung aufgerufen wird, obwohl die Länge des Strings schon zur Übersetzungszeit bekannt ist.<br />
So manche vector-Instanz der Art std::vector(array, array + sizeof(array) / sizeof(array[0])) kann man so natürlich auch syntaktisch verkürzen.</p>
<pre><code class="language-cpp">std::string myString1(&quot;Hello World&quot;); // muss die Länge von &quot;Hello World&quot; nochmal messen

template&lt;size_t N&gt; std::string build_string(char const (&amp;str)[N])
{
    return std::string(str, N - 1); // Länge ist bereits bekannt
}
std::string myString2(build_string(&quot;Hello World&quot;));
</code></pre>
<p>Dennoch vermute ich an der Sache einen Haken ... denn wenn es nicht irgend ein Problem damit gäbe, dann wäre diese Technik bereits in den Konstruktoren aller std::string oder std::vector Implementierungen drinnen, oder ?</p>
<p>Ich arbeite ja häufig mit Stringkonstanten, macht es da also Sinn diverse Methoden zu überladen, um die Länge der Konstanten schon zur Übersetzungszeit zu ermitteln?</p>
<p>Um Performance geht es mir da nicht zu sehr (ist ja kein großer Unterschied...), aber mir gefällt der Gedanke sehr, soviel Arbeit wie möglich vom Compiler erledigen zu lassen und nicht unnötig zur Laufzeit herumzurechnen.</p>
<p>Ich möchte nur sicherstellen, dass mir diese &quot;Optimierung&quot; nicht irgend wann wegen diverse Seiteneffekte um die Ohren fliegt. Hat da jemand Erfahrung damit?</p>
<p>Danke für eure Antworten <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>lg, XOR</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/279637/länge-einer-stringkonstante-zur-übersetzungszeit-ermitteln</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 12:20:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/279637.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 30 Dec 2010 23:59:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Länge einer Stringkonstante zur Übersetzungszeit ermitteln on Thu, 30 Dec 2010 23:59:53 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>In &quot;Mr. STLs&quot; letztem Video <a href="http://channel9.msdn.com/Shows/Going+Deep/C9-Lectures-Stephan-T-Lavavej-Standard-Template-Library-STL-10-of-10" rel="nofollow">http://channel9.msdn.com/Shows/Going+Deep/C9-Lectures-Stephan-T-Lavavej-Standard-Template-Library-STL-10-of-10</a><br />
fand ich wieder einmal wertvolles Grundwissen, das - warum auch immer - mir bisher nie untergekommen war: Das Auflösen eines nativen C-Array-Types per Template</p>
<p>template&lt;class T, size_t N&gt; void foo(T const (&amp;a)[N]) { ... }</p>
<p>Die Methode finde ich äußerst praktisch für das Initialisieren von String- und Array-Klassen.<br />
Es hat mich immer schon etwas gestört, dass beim Erzeugen von std::string aus einem (char const <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="😉"
    /> intern nochmals eine strlen Implementierung aufgerufen wird, obwohl die Länge des Strings schon zur Übersetzungszeit bekannt ist.<br />
So manche vector-Instanz der Art std::vector(array, array + sizeof(array) / sizeof(array[0])) kann man so natürlich auch syntaktisch verkürzen.</p>
<pre><code class="language-cpp">std::string myString1(&quot;Hello World&quot;); // muss die Länge von &quot;Hello World&quot; nochmal messen

template&lt;size_t N&gt; std::string build_string(char const (&amp;str)[N])
{
    return std::string(str, N - 1); // Länge ist bereits bekannt
}
std::string myString2(build_string(&quot;Hello World&quot;));
</code></pre>
<p>Dennoch vermute ich an der Sache einen Haken ... denn wenn es nicht irgend ein Problem damit gäbe, dann wäre diese Technik bereits in den Konstruktoren aller std::string oder std::vector Implementierungen drinnen, oder ?</p>
<p>Ich arbeite ja häufig mit Stringkonstanten, macht es da also Sinn diverse Methoden zu überladen, um die Länge der Konstanten schon zur Übersetzungszeit zu ermitteln?</p>
<p>Um Performance geht es mir da nicht zu sehr (ist ja kein großer Unterschied...), aber mir gefällt der Gedanke sehr, soviel Arbeit wie möglich vom Compiler erledigen zu lassen und nicht unnötig zur Laufzeit herumzurechnen.</p>
<p>Ich möchte nur sicherstellen, dass mir diese &quot;Optimierung&quot; nicht irgend wann wegen diverse Seiteneffekte um die Ohren fliegt. Hat da jemand Erfahrung damit?</p>
<p>Danke für eure Antworten <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>lg, XOR</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2000597</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2000597</guid><dc:creator><![CDATA[xor]]></dc:creator><pubDate>Thu, 30 Dec 2010 23:59:53 GMT</pubDate></item><item><title><![CDATA[Reply to Länge einer Stringkonstante zur Übersetzungszeit ermitteln on Fri, 31 Dec 2010 00:22:06 GMT]]></title><description><![CDATA[<p>Wenn ich eine Funktion mit Parameter <code>const char*</code> aufrufe, heisst das noch lange nicht, dass es sich um eine Compilezeitkonstante handelt.</p>
<blockquote>
<p>Um Performance geht es mir da nicht zu sehr</p>
</blockquote>
<p>Aber das ist anscheinend der Grund hier fuer Templates, denn Typsicherheit kann es ja nicht sein. Auch gewinnst du dadurch nichts, da strlen in O(n) ablaeuft und die Konstruktion des Strings ebenfalls. Du verkomplizierst alles nur. If you have a shiny new hammer ... und so.</p>
<blockquote>
<p>gefällt der Gedanke</p>
</blockquote>
<p>Dir gefaellt es heute, morgen vielleicht nicht. Was ist mit anderen, die deinen Quelltext lesen, etc. Es gibt keinen objektiven Grund fuer diese &quot;Optimierung&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2000600</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2000600</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Fri, 31 Dec 2010 00:22:06 GMT</pubDate></item><item><title><![CDATA[Reply to Länge einer Stringkonstante zur Übersetzungszeit ermitteln on Fri, 31 Dec 2010 00:30:59 GMT]]></title><description><![CDATA[<p>Potentielles Problem:</p>
<pre><code class="language-cpp">void foo()
{
    char buf[512];
    sprintf(buf, &quot;%d&quot;, 123);

    std::string const s1 = buf;
    std::string const s2 = build_string(buf);

    assert(s1 == s2);
}
</code></pre>
<p>Und wenn es um allgemeine Arrays geht, nicht nur <code>char</code> Arrays, dann gibt's noch ein potentielles Problem:</p>
<pre><code class="language-cpp">template&lt;class T, size_t N&gt;
void very_cool_array_size_trick(T const (&amp;a)[N]) { /* ... */ }

void bar()
{
    struct something_with_internal_linkage { /* ... */ };

    something_with_internal_linkage arr[100];

    very_cool_array_size_trick(arr); // pustekuchen
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2000603</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2000603</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 31 Dec 2010 00:30:59 GMT</pubDate></item><item><title><![CDATA[Reply to Länge einer Stringkonstante zur Übersetzungszeit ermitteln on Fri, 31 Dec 2010 00:51:00 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>(...) If you have a shiny new hammer ... und so.</p>
</blockquote>
<p>Naja, immerhin fragt er hier um die &quot;Dynamik&quot; seines &quot;shiny new hammer&quot; besser zu verstehen, bevor er loshämmert.</p>
<blockquote>
<p>Was ist mit anderen, die deinen Quelltext lesen, etc. Es gibt keinen objektiven Grund fuer diese &quot;Optimierung&quot;.</p>
</blockquote>
<p>Der Trick ist so alt und so einfach, dass man mMn. voraussetzen sollte, dass ein C++ Programmierer es verstehen kann (wenn es nötig wird es zu verstehen).<br />
(Man beachte: voraussetzen sollte != voraussetzen kann ;))</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2000605</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2000605</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 31 Dec 2010 00:51:00 GMT</pubDate></item><item><title><![CDATA[Reply to Länge einer Stringkonstante zur Übersetzungszeit ermitteln on Fri, 31 Dec 2010 01:29:58 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13960">@hustbaer</a>: Ja ... deshalb frag ich <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="😉"
    /> ... auf Puffer dieser Art hatte ich wirklich nicht gedacht, da ich diese nie einsetze.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/21632">@knivil</a>:<br />
Ich meinte ja auch nur eine zusätzliche Überladung im Sinne von:</p>
<pre><code class="language-cpp">void addText(char const* txt, size_t len);
void addText(char const* txt) { addText(txt, strlen(txt)); }
template&lt;size_t N&gt; void addText(char const (&amp;txt)[N]) { addText(txt, N - 1); }
</code></pre>
<p>Ich sehe die Performance wirklich nicht kritisch, finde es aber dennoch sinnlos als Parameter eine Konstante zu übergeben, die eine Metainformation bereits enthält, die dann aber verworfen wird um danach einen Laufzeittest durchzuführen.<br />
Ich würde folgenden Code:</p>
<pre><code class="language-cpp">void writeLog(const std::string&amp; str) { fwrite(str.c_str(), 1, str.size(), f); }
</code></pre>
<p>auch durch diesen ergänzen</p>
<pre><code class="language-cpp">void writeLog(char const* str, size_t len) { fwrite(str, 1, len, f); }
void writeLog(char const* str)             { writeLog(str, strlen(str)); }
void writeLog(const std::string&amp; str)      { writeLog(str.c_str(), str.size());}
</code></pre>
<p>Natürlich wird das Interface dadurch komplizierter ... aber das Risiko gehe ich ein <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>
<p>Jedenfalls danke fürs Feedback <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="👍"
    /> - werde die std::string Implementierung vorerst nicht abändern <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Aber es stimmt schon ... wenn man etwas Zeit findet sich Code durchzusehen, kommt einem schon der eine oder andere &quot;shiny new hammer&quot; in die Quere, und dann sieht man auch den Wald vor lauter Bäumen nicht.</p>
<p>Happy new year!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2000622</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2000622</guid><dc:creator><![CDATA[xor]]></dc:creator><pubDate>Fri, 31 Dec 2010 01:29:58 GMT</pubDate></item></channel></rss>