<?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[Inline]]></title><description><![CDATA[<p>Hallo zusammen, ich habe einige Fragen zu dem Schlüsselwort <code>inline</code> .<br />
Es ist ja so, dass der Compiler einem relativ wenig Spielraum lässt, selber zu inlinen. Wenn Inline-Funktionen zu gross werden, optimiert er das <code>inline</code> raus. Geht das auch umgekehrt, also dass sehr kurze Funktionen automatisch als Inline-Funktionen benutzt werden?</p>
<p>Bei Klassen wird oft empfohlen, Getter- und Setter-Methoden inline zu deklarieren. Bei modularem Programmaufbau hat das auch Einfluss darauf, wo die Methoden definiert werden (inline in Klassendefinition oder im Header, normal in Implementierungsdatei). Inwiefern kann der Compiler hier noch selbst bestimmen? Ein einfaches Umwandeln zu Inline (oder davon weg) führt zu Konflikten mit dem Linker. Der Compiler müsste also schon die Funktionen zwischen Dateien verschieben, was ich mir nicht ganz vorstellen kann. Wie sieht es diesbezüglich aus?</p>
<p>Bei Klassentemplates ist es erlaubt, die gesamte Klasse inklusive Methoden in einem Header zu definieren. Sind dann alle Methoden (die ausserhalb der Klasse, aber in der selben Headerdatei definiert wurden) automatisch inline? Wenn nicht, wieso führt das nicht zu Mehrfachdefinitionen? Und wozu ist das Schlüsselwort <code>export</code> da, bzw. unter welchen Umständen setzt man es ein?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/219555/inline</link><generator>RSS for Node</generator><lastBuildDate>Wed, 07 Oct 2026 14:02:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/219555.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 04 Aug 2008 20:57:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Inline on Mon, 04 Aug 2008 20:57:38 GMT]]></title><description><![CDATA[<p>Hallo zusammen, ich habe einige Fragen zu dem Schlüsselwort <code>inline</code> .<br />
Es ist ja so, dass der Compiler einem relativ wenig Spielraum lässt, selber zu inlinen. Wenn Inline-Funktionen zu gross werden, optimiert er das <code>inline</code> raus. Geht das auch umgekehrt, also dass sehr kurze Funktionen automatisch als Inline-Funktionen benutzt werden?</p>
<p>Bei Klassen wird oft empfohlen, Getter- und Setter-Methoden inline zu deklarieren. Bei modularem Programmaufbau hat das auch Einfluss darauf, wo die Methoden definiert werden (inline in Klassendefinition oder im Header, normal in Implementierungsdatei). Inwiefern kann der Compiler hier noch selbst bestimmen? Ein einfaches Umwandeln zu Inline (oder davon weg) führt zu Konflikten mit dem Linker. Der Compiler müsste also schon die Funktionen zwischen Dateien verschieben, was ich mir nicht ganz vorstellen kann. Wie sieht es diesbezüglich aus?</p>
<p>Bei Klassentemplates ist es erlaubt, die gesamte Klasse inklusive Methoden in einem Header zu definieren. Sind dann alle Methoden (die ausserhalb der Klasse, aber in der selben Headerdatei definiert wurden) automatisch inline? Wenn nicht, wieso führt das nicht zu Mehrfachdefinitionen? Und wozu ist das Schlüsselwort <code>export</code> da, bzw. unter welchen Umständen setzt man es ein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559265</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559265</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 04 Aug 2008 20:57:38 GMT</pubDate></item><item><title><![CDATA[Reply to Inline on Mon, 04 Aug 2008 21:50:25 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Bei Klassen wird oft empfohlen, Getter- und Setter-Methoden inline zu deklarieren. Bei modularem Programmaufbau hat das auch Einfluss darauf, wo die Methoden definiert werden (inline in Klassendefinition oder im Header, normal in Implementierungsdatei). Inwiefern kann der Compiler hier noch selbst bestimmen? Ein einfaches Umwandeln zu Inline (oder davon weg) führt zu Konflikten mit dem Linker. Der Compiler müsste also schon die Funktionen zwischen Dateien verschieben, was ich mir nicht ganz vorstellen kann. Wie sieht es diesbezüglich aus?</p>
</blockquote>
<p>Abgesehen davon, dass es vom Compiler abhängt, kann man sich bei <code>inline</code> imho sehr gut auf die bekannteren Compiler verlassen. Soweit ich das mal beobachtet hab, werden kleine Funktionen beim VS05 automatisch ge-inline-t. Abgesehen davon, dass es in den meisten Fällen eh keinen großen Performance-Unterschied macht, ist der Compiler dann doch oft schlauer als der Programmierer.</p>
<p>Btw: Der Compiler muss da nichts &quot;in Dateien verschieben&quot;, sowas passiert ja auf Symbol-Ebene und wird vom Optimierer übernommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559287</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559287</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Mon, 04 Aug 2008 21:50:25 GMT</pubDate></item><item><title><![CDATA[Reply to Inline on Mon, 04 Aug 2008 21:55:36 GMT]]></title><description><![CDATA[<p>Compiler haben da ja recht viel Optimierungsmöglichkeiten und können ganze Funktionen wegoptimieren. Ansonsten sehe ich da im Standard nichts, was es einer Implementierun verbietet selber zu inlinen, oder noch weiter zu gehen. (Solange es keinen Unterschied bei der Ausführung macht).</p>
<p>Export ist dazu gedacht eine Templatedefinition in einer Übersetzungseinheit zu binden und die Mehrfachdefinition zu verhindern. Was ja bekannterweise nur sehr wenige Compiler unterstützen. (Comeau, der einzige, den ich kenne).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559289</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559289</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 04 Aug 2008 21:55:36 GMT</pubDate></item><item><title><![CDATA[Reply to Inline on Tue, 05 Aug 2008 08:52:30 GMT]]></title><description><![CDATA[<p>Danke für die Antworten.</p>
<p>Also braucht man das Schlüsselwort <code>inline</code> eigentlich nicht selber, weil man sich auf eine Optimierung durch den Compiler verlassen kann?</p>
<p>Badestrand schrieb:</p>
<blockquote>
<p>Btw: Der Compiler muss da nichts &quot;in Dateien verschieben&quot;, sowas passiert ja auf Symbol-Ebene und wird vom Optimierer übernommen.</p>
</blockquote>
<p>Nehmen wir an, wir hätten eine selbst definierte Inline-Funktion in einem Header. Dem Compiler ist die Funktion zu gross, er optimiert das <code>inline</code> weg. Die Funktion darf also in diesem Header nur noch deklariert werden. Spielt es dann keine Rolle, wo sie definiert ist (das ist in gar keiner Datei mehr, sondern direkt ein Symbol)? Es wird also automatisch Speicherplatz bereitgestellt?</p>
<p>drakon schrieb:</p>
<blockquote>
<p>Export ist dazu gedacht eine Templatedefinition in einer Übersetzungseinheit zu binden und die Mehrfachdefinition zu verhindern. Was ja bekannterweise nur sehr wenige Compiler unterstützen. (Comeau, der einzige, den ich kenne).</p>
</blockquote>
<p>Okay, ich hab mich jetzt noch einmal ein bisschen genauer dazu informiert (z.B. auch den Artikel über Templates gelesen). Es ist also kaum möglich, Templates in Header- und Implementierungsdatei zu trennen.<br />
Das heisst, normalerweise werden Templates mehrfach definiert? Kann das nicht zu Problemen führen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559443</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559443</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 05 Aug 2008 08:52:30 GMT</pubDate></item><item><title><![CDATA[Reply to Inline on Tue, 05 Aug 2008 09:50:00 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Dem Compiler ist die Funktion zu gross, er optimiert das <code>inline</code> weg. Die Funktion darf also in diesem Header nur noch deklariert werden.</p>
</blockquote>
<p>Was soll das heißen, dass das inline wegoptimiert wird? Jedenfalls hängt die Frage, wo Funktionen definiert werden müssen (mithin: ob ein Programm standardkonform ist oder nicht), nicht von den Launen des Compilers ab.</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Das heisst, normalerweise werden Templates mehrfach definiert? Kann das nicht zu Problemen führen?</p>
</blockquote>
<p>Dann, wenn die Templatedefinition in den verschiedenen ÜEs nicht exakt gleich sind (dieses &quot;exakt gleich&quot; bedarf einer relativ umfangreichen Definition). In diesem Fall ist die ODR verletzt. Sind die Definitionen alle exakt gleich, kann der Compiler/Linker sich irgendeine davon heraussuchen. Praktisch heißt das, dass bei der Instantiierung von Templates aus Sicht des Linkers sogenannte &quot;weak symbols&quot; exportiert werden, solche Symbole dürfen mehrfach (in verschiedenen Objektdateien) existieren, und der Linker nimmt dann bei der Erstellung des fertigen Programmes irgendein beliebiges (für gewöhnlich, das erste, das gefunden wird).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559495</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559495</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 05 Aug 2008 09:50:00 GMT</pubDate></item><item><title><![CDATA[Reply to Inline on Tue, 05 Aug 2008 10:03:05 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Nexus schrieb:</p>
<blockquote>
<p>Dem Compiler ist die Funktion zu gross, er optimiert das <code>inline</code> weg. Die Funktion darf also in diesem Header nur noch deklariert werden.</p>
</blockquote>
<p>Was soll das heißen, dass das inline wegoptimiert wird? Jedenfalls hängt die Frage, wo Funktionen definiert werden müssen (mithin: ob ein Programm standardkonform ist oder nicht), nicht von den Launen des Compilers ab.</p>
</blockquote>
<p>Ich meinte mit wegoptimieren, dass eine Inline-Funktion vom Compiler zu einer normalen gemacht wird, wenn sich das <code>inline</code> sich mehr lohnt (bei grossen Funktionen). Wenn eine solche Umwandlung vom Compiler stattfindet, kann man davon ausgehen, dass es aufs Gleiche rauskommt, wie wenn man die Funktion selber als nicht inline definieren würde (und umgekehrt genauso)?</p>
<p>camper schrieb:</p>
<blockquote>
<p>Nexus schrieb:</p>
<blockquote>
<p>Das heisst, normalerweise werden Templates mehrfach definiert? Kann das nicht zu Problemen führen?</p>
</blockquote>
<p>Dann, wenn die Templatedefinition in den verschiedenen ÜEs nicht exakt gleich sind (dieses &quot;exakt gleich&quot; bedarf einer relativ umfangreichen Definition). In diesem Fall ist die ODR verletzt. Sind die Definitionen alle exakt gleich, kann der Compiler/Linker sich irgendeine davon heraussuchen. Praktisch heißt das, dass bei der Instantiierung von Templates aus Sicht des Linkers sogenannte &quot;weak symbols&quot; exportiert werden, solche Symbole dürfen mehrfach (in verschiedenen Objektdateien) existieren, und der Linker nimmt dann bei der Erstellung des fertigen Programmes irgendein beliebiges (für gewöhnlich, das erste, das gefunden wird).</p>
</blockquote>
<p>Okay, danke für die Erklärung. Ich nehme an, dass das &quot;exakt gleich&quot; in normalen Fällen erfüllt ist und man sich darüber keine weiteren Gedanken machen muss...</p>
<p>Was ich aber trotzdem nicht ganz verstehe: Wieso sind bei Templates solche Mehrfachdefinitionen erlaubt, bei anderen Sprachkonstrukten (normale Klassen, Funktionen, Variablen) aber nicht? Ist das eine Sonderregelung, weil Templates sonst nicht implementierbar wären?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559505</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559505</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 05 Aug 2008 10:03:05 GMT</pubDate></item><item><title><![CDATA[Reply to Inline on Tue, 05 Aug 2008 12:31:25 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Ich meinte mit wegoptimieren, dass eine Inline-Funktion vom Compiler zu einer normalen gemacht wird, wenn sich das <code>inline</code> sich mehr lohnt (bei grossen Funktionen). Wenn eine solche Umwandlung vom Compiler stattfindet, kann man davon ausgehen, dass es aufs Gleiche rauskommt, wie wenn man die Funktion selber als nicht inline definieren würde (und umgekehrt genauso)?</p>
</blockquote>
<p>Arbeite mit deinem Compiler zusammen. Also verlass dich nicht nur auf deinen Compiler und verlass dich nicht nur auf dich selbst.<br />
Ich bin mir jetzt nicht sicher, aber eine <code>inline</code> Funktion, darf ein Compiler nicht de'inlinen. Er darf aber umgekehrt nicht- <code>inline</code> zu <code>inline</code> Funktionen machen. Es wird aber nirgends vorgeschrieben, dass er dies auch macht!</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Was ich aber trotzdem nicht ganz verstehe: Wieso sind bei Templates solche Mehrfachdefinitionen erlaubt, bei anderen Sprachkonstrukten (normale Klassen, Funktionen, Variablen) aber nicht? Ist das eine Sonderregelung, weil Templates sonst nicht implementierbar wären?</p>
</blockquote>
<p>Was verstehst du unter Mehrfachdefinition?</p>
<p>Irgendwie habe ich das Gefühl, dass du zwei Dinge nicht so ganz verstehst:<br />
1. Der Code, welcher du schreibst, verschwindet komplett beim Compilieren und es entstehen daraus Objekt-Dateien (*.o für g++, *.obj für MSVC).<br />
Zuerst wird der Präprozessor ausgeführt, welcher eine Kopie des Codes verändert. Danach läuft der Compiler drüber, welcher aus dieser veränderten Kopie eine Objekt-Datei erstellt. Ob zum Beispiel eine Funktion inline ist oder nicht, hängt danach nur noch von einem Flag ab (Bit gesetzt oder nicht). Von C++ Code ist da definitiv nichts mehr zu sehen und hat oft auch nichts mehr damit zu tun. Die Objekt-Dateien sind in einer eigenen Sprache geschrieben. Meistens einer so flexiblen, dass sich allerhand anderer Sprachen in diese übersetzen lassen. Aus dieser eigenen Sprache erzeugt der Compiler, bzw. Linker, die ausführbare Datei.<br />
2. Ein Template ist nur eine Schablone. Das ist keine vollwertige Klasse! Dank der Schablone kann der Compiler dann Klassen erzeugen und mit den erzeugten Klassen dann Objekte. Die erzeugten Klassen sind dann aber sicher nicht als C++ Code vorhanden, sondern bereits auf der Symbolebene, bzw. in der Objekt-Datei. Dort gelten, wie schon bei Punkt 1 gesagt, andere Regeln.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559602</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559602</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 05 Aug 2008 12:31:25 GMT</pubDate></item><item><title><![CDATA[Reply to Inline on Tue, 05 Aug 2008 12:50:37 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich bin mir jetzt nicht sicher, aber eine inline Funktion, darf ein Compiler nicht de'inlinen.</p>
</blockquote>
<p>Doch. inline ist nur ein Hinweis für den Kompiler, dass er kann, wenn er es für richtig hält.<br />
Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559613</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559613</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Tue, 05 Aug 2008 12:50:37 GMT</pubDate></item><item><title><![CDATA[Reply to Inline on Tue, 05 Aug 2008 12:51:45 GMT]]></title><description><![CDATA[<p>inline- FAQ:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-105893.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-105893.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559614</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559614</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Tue, 05 Aug 2008 12:51:45 GMT</pubDate></item><item><title><![CDATA[Reply to Inline on Tue, 05 Aug 2008 20:51:20 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Ich bin mir jetzt nicht sicher, aber eine <code>inline</code> Funktion, darf ein Compiler nicht de'inlinen. Er darf aber umgekehrt nicht- <code>inline</code> zu <code>inline</code> Funktionen machen.</p>
</blockquote>
<p>Gut, dass du dir nicht ganz sicher bist. Der Compiler darf sehr wohl das inline ignorieren (manchmal kann er nicht anders, z.B. ist es manchmal nicht so einfach, Rekursionen zu inlinen). Insgesamt ist inline nur ein Hinweis an den Compiler &quot;unter Umständen könntest du hier...&quot; - den er befolgen kann, aber nicht muss. Die meisten modernen Compiler sind durchaus in der Lage, die inline-Entscheidung selber zu treffen, und zwar aus stichhaltigeren Gründen als der Intuition des Programmierers.<br />
Sutter hat in <em>Exceptional C++ Style</em>, Item 25, 9 Seiten übers inlining geschrieben - mit dem Fazit, dass man inline nicht explizit angeben sollte, bis der Profiler einem bescheinigt dass es nötig ist. (Alles in allem ist Inlining eine Optimierung, und frühzeitige Optimierungen sind Mist).</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>Nexus schrieb:</p>
<blockquote>
<p>Was ich aber trotzdem nicht ganz verstehe: Wieso sind bei Templates solche Mehrfachdefinitionen erlaubt, bei anderen Sprachkonstrukten (normale Klassen, Funktionen, Variablen) aber nicht? Ist das eine Sonderregelung, weil Templates sonst nicht implementierbar wären?</p>
</blockquote>
<p>Was verstehst du unter Mehrfachdefinition?</p>
<p>Irgendwie habe ich das Gefühl, dass du zwei Dinge nicht so ganz verstehst:<br />
1. Der Code, welcher du schreibst, verschwindet komplett beim Compilieren und es entstehen daraus Objekt-Dateien (*.o für g++, *.obj für MSVC).<br />
Zuerst wird der Präprozessor ausgeführt, welcher eine Kopie des Codes verändert. Danach läuft der Compiler drüber, welcher aus dieser veränderten Kopie eine Objekt-Datei erstellt. Ob zum Beispiel eine Funktion inline ist oder nicht, hängt danach nur noch von einem Flag ab (Bit gesetzt oder nicht). Von C++ Code ist da definitiv nichts mehr zu sehen und hat oft auch nichts mehr damit zu tun. Die Objekt-Dateien sind in einer eigenen Sprache geschrieben. Meistens einer so flexiblen, dass sich allerhand anderer Sprachen in diese übersetzen lassen. Aus dieser eigenen Sprache erzeugt der Compiler, bzw. Linker, die ausführbare Datei.<br />
2. Ein Template ist nur eine Schablone. Das ist keine vollwertige Klasse! Dank der Schablone kann der Compiler dann Klassen erzeugen und mit den erzeugten Klassen dann Objekte. Die erzeugten Klassen sind dann aber sicher nicht als C++ Code vorhanden, sondern bereits auf der Symbolebene, bzw. in der Objekt-Datei. Dort gelten, wie schon bei Punkt 1 gesagt, andere Regeln.Grüssli</p>
</blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a>: im Thread &quot;Templates!?&quot; hab ich eine kurze Erklärung geschrieben, was der Compiler mit Templates bei ihrer Instantiierung anstellt - er erzeugt anhand der Informationen über die eingesetzten Typen und anhand der ihm vorliegenen Templatedefinition den nötigen Code. Wenn also in zwei verschiedenen Übersetzungseinheiten das gleiche (nicht zwangsläufig das selbe) template instantiiert wird, wird beidesmal der selbe (!) Objektcode erzeugt (vorausgesetzt die beiden verwendeten Templatedefinitionen sind sich hinreichend ähnlich), so dass in beiden Objektdateien die von camper angesprochenen weak symbols und der zugehörige Code vorhanden sind. Da beidemal die komplette templatedefinition mit verwurstet wird, kann (bzw. braucht) der Compiler nicht zu unterscheiden ob es sich um dieselbe Definition (also dieselbe source-Datei) oder zwei identische Definitionen (derselbe Code in zwei verschiedenen Dateien) handelt, oder ob es sogar leicht verschiedene Definitionen sind, die aber zum selben Ergebnis führen. Wenn die beiden Definitionen so verschieden sind, dass das Ergebnis sich deutlich unterscheidet, dann ist das Ergebnis meines Wissens undefiniert, da nicht festgelegt ist, welche der beiden weak symbols (mit den dranhängenden verschiedenen Codes) sich der Linker aussucht.</p>
<p>Was ich mir beispielsweise als akzeptablen Unterschied vorstellen könnte sind verschiedene Zugriffsspezifizierer bei Methoden - solang keiner dagegen verstößt meckert der Compiler nicht, und der Linker kriegt den Unterschied private/protected/public vermutlich sowieso nicht mit, der erzeugte Code müsste also identisch sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559628</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559628</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 05 Aug 2008 20:51:20 GMT</pubDate></item><item><title><![CDATA[Reply to Inline on Tue, 05 Aug 2008 13:15:16 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Okay, danke für die Erklärung. Ich nehme an, dass das &quot;exakt gleich&quot; in normalen Fällen erfüllt ist und man sich darüber keine weiteren Gedanken machen muss...</p>
</blockquote>
<p>Solange du den Code nicht kopierst und veränderst, brauchst du ja immer den gleichen Header. Somit wird es schwer unterschiedlichen Code zu haben. <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/1559634</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559634</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 05 Aug 2008 13:15:16 GMT</pubDate></item><item><title><![CDATA[Reply to Inline on Tue, 05 Aug 2008 20:36:59 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Was verstehst du unter Mehrfachdefinition?</p>
</blockquote>
<p>Ich meinte damit Symbole, die (schlussendlich gesehen) in mehreren Objektdateien definiert wurden, sodass für den Linker das selbe Symbol mehrfach existiert. Auf Quelltextbasis passiert das ja, wenn man einen Header mit Definitionen in verschiedene CPP-Dateien einbindet.</p>
<p>Der Vorgang der Codeerstellung war mir schon noch ungefähr so im Kopf - aber eben ungefähr <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="😉"
    /> - danke für deine Erläuterung.</p>
<p>pumuckl schrieb:</p>
<blockquote>
<p>Sutter hat [...] geschrieben - mit dem Fazit, dass man inline nicht explizit angeben sollte, bis der Profiler einem bescheinigt dass es nötig ist. (Alles in allem ist Inlining eine Optimierung, und frühzeitige Optimierungen sind Mist).</p>
</blockquote>
<p>Okay, so was in der Art wollte ich hören. Ich verzichtete bisher weitgehend auf den Einsatz von <code>inline</code> , in der Hoffnung, der Compiler könnte das sowieso besser entscheiden.</p>
<p>Auch dir danke ich für die Erklärungen. Ich hab jetzt auch noch deinen Beitrag über Templates gelesen, er hat einiges geklärt.</p>
<p>Diese sogenannten Weak Symbols treten nur bei Templates auf? Sonstige Mehrfachdefinitionen enden ja in Linkerfehlern. Aber weil bei Templates noch kein festes Konstrukt (Funktion oder Klasse), sondern nur eine Schablone vorliegt, macht es nichts, wenn mehrere identische Symbole vorhanden sind? Oder wurde da eben eine Sonderregelung eingeführt, sodass der Linker alles mehrfach definierte ausser Templates mit Fehlermeldungen meldet?</p>
<p>drakon schrieb:</p>
<blockquote>
<p>Solange du den Code nicht kopierst und veränderst, brauchst du ja immer den gleichen Header. Somit wird es schwer unterschiedlichen Code zu haben. <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>
</blockquote>
<p>Okay <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="🙂"
    /><br />
Ich frag mich, ob das in der Praxis überhaupt zu Problemen führt (gibt es viele Leute, die Header kopieren und leicht abändern)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559872</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559872</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 05 Aug 2008 20:36:59 GMT</pubDate></item><item><title><![CDATA[Reply to Inline on Tue, 05 Aug 2008 21:08:17 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Aber weil bei Templates noch kein festes Konstrukt (Funktion oder Klasse), sondern nur eine Schablone vorliegt, macht es nichts, wenn mehrere identische Symbole vorhanden sind? Oder wurde da eben eine Sonderregelung eingeführt, sodass der Linker alles mehrfach definierte ausser Templates mit Fehlermeldungen meldet?</p>
</blockquote>
<p>Das hast du vermutlich missverstanden. Die Symbole werden ja erst im Objektcode erzeugt, sind sozusagen die Schnittstellen der Objektdateien. Bei Templates wird Objektcode ja erst erzeugt, wenn sie instantiiert werden. Ich bin was die Symbole und das Linking angeht icht so ganz firm, aber ich denke man kann das an folgendem Beispiel verstehen:<br />
wenn ich einen Funktionsaufruf habe, macht der Compiler daraus im Objektcode einen Aufruf an ein bestimmtes Symbol. Wenn ich die Definition einer Funktion in einer ÜE habe, wird dauraus eben so ein Symbol. So ein Symbol beinhaltet in gewisser Form den namen, Rückgabewert und parameterliste einer Funktion.<br />
Das Problem bei Temaplate-instantiierungen ist, dass sie in mehreren ÜEs vorkommen können. Da der Compiler die komplette Templatedefinition mit dem angegebenen Typ instantiiert, kann es vorkommen, dass beispeilsweise die Funktion <code>void f&lt;int&gt;()</code> in mehreren Übersetzungseinheiten vorkommt. Es gibt also das Selbe Symbol in mehreren Objektdateien, wenn der Compiler fertig ist. Damit der Linker nicht anfängt zu lamentieren muss also die Übersetzung für instantiierte Template-Funktionen ein weak symbol liefern. Man könnte sich grundsätzlich also vorstellen, den Standard um ein Schlüsselwort (weak?) zu erweitern das dafür sorgt, dass damit gekennzeichnete Funktionen zu weak symbols übersetzt werden, um zu sagen &quot;Hey Linker, kann sein dass das Symbol hier an mehreren Stellen angeboten wird, such dir einfach eins aus, wird schon passen&quot;.</p>
<p>Die Profis bezüglich Compiler-Interna mögen mich berichtigen wenn ich hier völligen Humbug verzapft hab, bin im dragon book noch nicht so weit fortgeschritten...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1559883</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1559883</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 05 Aug 2008 21:08:17 GMT</pubDate></item><item><title><![CDATA[Reply to Inline on Wed, 06 Aug 2008 10:50:25 GMT]]></title><description><![CDATA[<p>Okay, dann ist es einfach so festgelegt, dass bei Templates Weak Symbols erstellt werden, und bei normalen Klassen/Funktionen/Variablen normale (strong?) Symbole, die nur einmal definiert sein dürfen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1560130</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1560130</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 06 Aug 2008 10:50:25 GMT</pubDate></item><item><title><![CDATA[Reply to Inline on Sun, 10 Aug 2008 13:27:30 GMT]]></title><description><![CDATA[<p>Das Thema wäre für mich immer noch aktuell <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/1562232</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1562232</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 10 Aug 2008 13:27:30 GMT</pubDate></item></channel></rss>