<?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[Dynamische und statische Speicherbeschaffung, Klassen-Templates]]></title><description><![CDATA[<p>Hallo,</p>
<p>Wo liegt für den Compiler der Unterschied zwischen dynamisch und statisch erzeugten Objekten, also jetzt mal abgesehen von Gültigkeitsbereichen?<br />
Wenn ich zum Beispiel dynamisch ein Array erzeuge</p>
<pre><code>int *p = new int[4];
</code></pre>
<p>Dann weiß der Compiler doch genau wie bei statischen Definitionen auch schon zur Übersetzungszeit, dass er hier Speicherplatz von der Grösse von 4 mal int beschaffen muss. Dass er dafür Speicherplatz vom Heap reserviert ist doch dabei irrelevant.</p>
<p>Außerdem hätte ich noch eine andere Frage bezüglich Klassen-Templates:<br />
Wenn ich eine Template-Klasse habe und darüber einen Parameter übergebe, z.B</p>
<pre><code>template&lt;typename T, int grösse&gt;
class Ding {...}
</code></pre>
<p>Wo besteht dann für den Compiler einen Unterschied, ob ich den Parameter grösse über das Template weitergebe, oder über den Konstruktor an das Objekt?</p>
<pre><code>Ding&lt;char, 6&gt; EinDing;
Ding&lt;char&gt; EinDing(6);
</code></pre>
<p>Es wird doch beides statisch erzeugt, und der Compiler weiß in beiden Fällen schon zu Übersetzungszeit über die Grösse des Objekts Bescheid, oder etwa nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/313593/dynamische-und-statische-speicherbeschaffung-klassen-templates</link><generator>RSS for Node</generator><lastBuildDate>Sun, 02 Aug 2026 03:54:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/313593.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 05 Feb 2013 09:25:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Dynamische und statische Speicherbeschaffung, Klassen-Templates on Tue, 05 Feb 2013 09:25:48 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Wo liegt für den Compiler der Unterschied zwischen dynamisch und statisch erzeugten Objekten, also jetzt mal abgesehen von Gültigkeitsbereichen?<br />
Wenn ich zum Beispiel dynamisch ein Array erzeuge</p>
<pre><code>int *p = new int[4];
</code></pre>
<p>Dann weiß der Compiler doch genau wie bei statischen Definitionen auch schon zur Übersetzungszeit, dass er hier Speicherplatz von der Grösse von 4 mal int beschaffen muss. Dass er dafür Speicherplatz vom Heap reserviert ist doch dabei irrelevant.</p>
<p>Außerdem hätte ich noch eine andere Frage bezüglich Klassen-Templates:<br />
Wenn ich eine Template-Klasse habe und darüber einen Parameter übergebe, z.B</p>
<pre><code>template&lt;typename T, int grösse&gt;
class Ding {...}
</code></pre>
<p>Wo besteht dann für den Compiler einen Unterschied, ob ich den Parameter grösse über das Template weitergebe, oder über den Konstruktor an das Objekt?</p>
<pre><code>Ding&lt;char, 6&gt; EinDing;
Ding&lt;char&gt; EinDing(6);
</code></pre>
<p>Es wird doch beides statisch erzeugt, und der Compiler weiß in beiden Fällen schon zu Übersetzungszeit über die Grösse des Objekts Bescheid, oder etwa nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2296123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2296123</guid><dc:creator><![CDATA[climits]]></dc:creator><pubDate>Tue, 05 Feb 2013 09:25:48 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische und statische Speicherbeschaffung, Klassen-Templates on Tue, 05 Feb 2013 09:31:27 GMT]]></title><description><![CDATA[<p>climits schrieb:</p>
<blockquote>
<p>Hallo,</p>
<p>Wo liegt für den Compiler der Unterschied zwischen dynamisch und statisch erzeugten Objekten, also jetzt mal abgesehen von Gültigkeitsbereichen?<br />
Wenn ich zum Beispiel dynamisch ein Array erzeuge</p>
<pre><code>int *p = new int[4];
</code></pre>
<p>Dann weiß der Compiler doch genau wie bei statischen Definitionen auch schon zur Übersetzungszeit, dass er hier Speicherplatz von der Grösse von 4 mal int beschaffen muss. Dass er dafür Speicherplatz vom Heap reserviert ist doch dabei irrelevant.</p>
</blockquote>
<p>In diesem Spezialfall, ja.</p>
<p>Aber was wenn du:</p>
<pre><code class="language-cpp">int i;
cin&gt;&gt;i;
int* p=new int[i];
</code></pre>
<p>schreibst?</p>
<blockquote>
<p>Außerdem hätte ich noch eine andere Frage bezüglich Klassen-Templates:<br />
Wenn ich eine Template-Klasse habe und darüber einen Parameter übergebe, z.B</p>
<pre><code>template&lt;typename T, int grösse&gt;
class Ding {...}
</code></pre>
<p>Wo besteht dann für den Compiler einen Unterschied, ob ich den Parameter grösse über das Template weitergebe, oder über den Konstruktor an das Objekt?</p>
<pre><code>Ding&lt;char, 6&gt; EinDing;
Ding&lt;char&gt; EinDing(6);
</code></pre>
<p>Es wird doch beides statisch erzeugt, und der Compiler weiß in beiden Fällen schon zu Übersetzungszeit über die Grösse des Objekts Bescheid, oder etwa nicht?</p>
</blockquote>
<p>Selbes Beispiel wie oben:</p>
<pre><code class="language-cpp">int i;
cin&gt;&gt;i;
Ding&lt;char, i&gt; einDing; //geht nicht
Ding&lt;char&gt; einDing(i); //geht sehr wohl
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2296125</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2296125</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Tue, 05 Feb 2013 09:31:27 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische und statische Speicherbeschaffung, Klassen-Templates on Tue, 05 Feb 2013 09:36:10 GMT]]></title><description><![CDATA[<p>Jain,</p>
<p>er könnte es in beiden Fällen wissen (mit beide Fälle meine ich deine beiden Fragen), aber das heisst nicht, dass er das nutzt oder nutzen muss.</p>
<p>Klar, wenn du dir ein Programm schreibst, welches eine Funktion zum berechnen der Fibonacci-Folge enthält und du lässt dir den 10. Fibonacci-Wert Ausgeben, dann kann der Compiler das sehen, aber berechnen tut er das trotzdem erst zur Runtime (normalerweise).</p>
<p>Mit constexpr kannst du ihn dann dazu überreden das ganze zur Compilezeit zu berechnen.</p>
<p>Allerdings, Templateparameter != Konstruktorparameter. Da hängt bei dir was falsch im Denken.</p>
<p>Kurzum, bei Templates muss der Compiler komplett Bescheid wissen, wie das Ergebnis auszusehen hat, er passt lediglich die Typen an. (so ausgedrückt stimmt das zwar nicht, aber das ist mir jetzt egal, denn angepasst wird nix) Zur Not wendet er Rekursion an um sich sämtliche Definitionen herzuleiten. (Bis zum Ende ist für den Compiler nämlich nicht alles bekannt)</p>
<p>Gibst du aber Variablen oder Werte (Magic Values) an Funktionen, dann weiss der Compiler ja nicht was dort passiert. Und ausführen tut er das auch nicht (wie bei Templates), erst zur Laufzeit wird sowas dann berechnet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2296127</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2296127</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Tue, 05 Feb 2013 09:36:10 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische und statische Speicherbeschaffung, Klassen-Templates on Tue, 05 Feb 2013 10:19:36 GMT]]></title><description><![CDATA[<p>Danke für die Antworten, ich hätte da noch ein paar Rückfragen</p>
<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>In diesem Spezialfall, ja.</p>
<p>Aber was wenn du:</p>
<pre><code class="language-cpp">int i;
cin&gt;&gt;i;
int* p=new int[i];
</code></pre>
<p>schreibst?</p>
</blockquote>
<p>Ok, das verstehe ich. Wobei ich mich aber frage, warum genau in diesem Fall nicht auch statisch geht. Ist es deshalb, weil der übersetzte Code &quot;dicht&quot; liegen muss, und dass Array dann möglicherweise nicht mehr reinpasst, wenn es zu gross ist?</p>
<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Selbes Beispiel wie oben:</p>
<pre><code class="language-cpp">int i;
cin&gt;&gt;i;
Ding&lt;char, i&gt; einDing; //geht nicht
Ding&lt;char&gt; einDing(i); //geht sehr wohl
</code></pre>
</blockquote>
<p>Warum geht Ersteres pauschal nicht? Wenn i zum Beispiel nicht bestimmend für die Grösse eines Arrays oder ähnlichem ist, dann weiß der Compiler doch sowieso immer, wie gross daraus erzeugte Objekte werden.</p>
<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>Kurzum, bei Templates muss der Compiler komplett Bescheid wissen, wie das Ergebnis auszusehen hat, er passt lediglich die Typen an. (so ausgedrückt stimmt das zwar nicht, aber das ist mir jetzt egal, denn angepasst wird nix) Zur Not wendet er Rekursion an um sich sämtliche Definitionen herzuleiten. (Bis zum Ende ist für den Compiler nämlich nicht alles bekannt)</p>
</blockquote>
<p>Heißt dass, das z.B bei Template-Funktionen der Compiler schon im voraus alles berechnet und durchgeht?</p>
<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>Gibst du aber Variablen oder Werte (Magic Values) an Funktionen, dann weiss der Compiler ja nicht was dort passiert. Und ausführen tut er das auch nicht (wie bei Templates), erst zur Laufzeit wird sowas dann berechnet.</p>
</blockquote>
<p>Speziell bei Konstruktoren muss er aber doch trotzdem irgendwie schon im voraus berechnen, wie gross die zu erwartenden Objekte werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2296139</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2296139</guid><dc:creator><![CDATA[climits]]></dc:creator><pubDate>Tue, 05 Feb 2013 10:19:36 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische und statische Speicherbeschaffung, Klassen-Templates on Tue, 05 Feb 2013 10:25:19 GMT]]></title><description><![CDATA[<p>climits schrieb:</p>
<blockquote>
<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>In diesem Spezialfall, ja.</p>
<p>Aber was wenn du:</p>
<pre><code class="language-cpp">int i;
cin&gt;&gt;i;
int* p=new int[i];
</code></pre>
<p>schreibst?</p>
</blockquote>
<p>Ok, das verstehe ich. Wobei ich mich aber frage, warum genau in diesem Fall nicht auch statisch geht. Ist es deshalb, weil der übersetzte Code &quot;dicht&quot; liegen muss, und dass Array dann möglicherweise nicht mehr reinpasst, wenn es zu gross ist?</p>
</blockquote>
<p>wie will denn der Compiler wissen, was du zur Laufzeit von der Standard-Eingabe liest?</p>
<p>climits schrieb:</p>
<blockquote>
<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Selbes Beispiel wie oben:</p>
<pre><code class="language-cpp">int i;
cin&gt;&gt;i;
Ding&lt;char, i&gt; einDing; //geht nicht
Ding&lt;char&gt; einDing(i); //geht sehr wohl
</code></pre>
</blockquote>
<p>Warum geht Ersteres pauschal nicht? Wenn i zum Beispiel nicht bestimmend für die Grösse eines Arrays oder ähnlichem ist, dann weiß der Compiler doch sowieso immer, wie gross daraus erzeugte Objekte werden.</p>
</blockquote>
<p>Template-Paramater <strong>müssen</strong> zur Compilezeit ausgewertet werden können. Darum geht das stumpf nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2296142</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2296142</guid><dc:creator><![CDATA[Erklärer]]></dc:creator><pubDate>Tue, 05 Feb 2013 10:25:19 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische und statische Speicherbeschaffung, Klassen-Templates on Tue, 05 Feb 2013 10:28:31 GMT]]></title><description><![CDATA[<p>climits schrieb:</p>
<blockquote>
<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Selbes Beispiel wie oben:</p>
<pre><code class="language-cpp">int i;
cin&gt;&gt;i;
Ding&lt;char, i&gt; einDing; //geht nicht
Ding&lt;char&gt; einDing(i); //geht sehr wohl
</code></pre>
</blockquote>
<p>Warum geht Ersteres pauschal nicht? Wenn i zum Beispiel nicht bestimmend für die Grösse eines Arrays oder ähnlichem ist, dann weiß der Compiler doch sowieso immer, wie gross daraus erzeugte Objekte werden.</p>
</blockquote>
<p>Und woher weiss er, ob diese Zahl nicht doch die Größe eines Arrays ist?</p>
<p>climits schrieb:</p>
<blockquote>
<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>Kurzum, bei Templates muss der Compiler komplett Bescheid wissen, wie das Ergebnis auszusehen hat, er passt lediglich die Typen an. (so ausgedrückt stimmt das zwar nicht, aber das ist mir jetzt egal, denn angepasst wird nix) Zur Not wendet er Rekursion an um sich sämtliche Definitionen herzuleiten. (Bis zum Ende ist für den Compiler nämlich nicht alles bekannt)</p>
</blockquote>
<p>Heißt dass, das z.B bei Template-Funktionen der Compiler schon im voraus alles berechnet und durchgeht?</p>
</blockquote>
<p>Ja, der Compiler löst sämtliche Templates auf. Normale Funktion werden erst zur Laufzeit ausgeführt, da liegt der Unterschied.</p>
<p>climits schrieb:</p>
<blockquote>
<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>Gibst du aber Variablen oder Werte (Magic Values) an Funktionen, dann weiss der Compiler ja nicht was dort passiert. Und ausführen tut er das auch nicht (wie bei Templates), erst zur Laufzeit wird sowas dann berechnet.</p>
</blockquote>
<p>Speziell bei Konstruktoren muss er aber doch trotzdem irgendwie schon im voraus berechnen, wie gross die zu erwartenden Objekte werden.</p>
</blockquote>
<p>Die Objekte die er erzeugt sind abhängig von der Klassendefinition, und nur davon. Als einfache Merkrichtlinie kannst du dir merken, jedes Objekt einer Klasse ist so gross wie alle Membervariablen zusammenaddiert. (Wobei Arrays meistens eher nur eine Zeiger sind und damit nur 4/8 Byte groß --&gt; selbst fette std::string geben bei sizeof nur 14 oder so wieder [MSVC2010, aber ohne Gewähr])</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2296144</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2296144</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Tue, 05 Feb 2013 10:28:31 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische und statische Speicherbeschaffung, Klassen-Templates on Tue, 05 Feb 2013 10:30:52 GMT]]></title><description><![CDATA[<p>climits schrieb:</p>
<blockquote>
<p>Ok, das verstehe ich. Wobei ich mich aber frage, warum genau in diesem Fall nicht auch statisch geht. Ist es deshalb, weil der übersetzte Code &quot;dicht&quot; liegen muss, und dass Array dann möglicherweise nicht mehr reinpasst, wenn es zu gross ist?</p>
</blockquote>
<p>Naja, stell dir vor ich kann Zahlen von 1 bis 4 Milliarden eingeben.<br />
Soll der Compiler jetzt jedesmal 4 Milliarden ints reservieren, nur weil die theoretische Möglichkeit besteht, dass ein User einmal 4 Milliarden eingeben könnte?</p>
<blockquote>
<p>Warum geht Ersteres pauschal nicht? Wenn i zum Beispiel nicht bestimmend für die Grösse eines Arrays oder ähnlichem ist, dann weiß der Compiler doch sowieso immer, wie gross daraus erzeugte Objekte werden.</p>
</blockquote>
<p>Das ist eine Anforderung der Sprache.<br />
Template Parameter gehören zum Typ.<br />
Foo&lt;3&gt; ist ein anderer Typ als Foo&lt;4&gt;.<br />
Und Typen müssen zur Compilezeit feststehen.</p>
<p>Bedenke folgendes:</p>
<pre><code class="language-cpp">template&lt;int I&gt; class Foo;
template&lt;&gt; class Foo&lt;3&gt; { int arr[1000000]; };
template&lt;&gt; class Foo&lt;4&gt; { int arr[1]; };
</code></pre>
<p>Foo&lt;3&gt; ist jetzt 1000000*sizeof(int) groß, Foo&lt;4&gt; ist 1*sizeof(int) groß und Foo&lt;5&gt; gibt es garnicht.</p>
<p>Was soll hier passieren:</p>
<pre><code class="language-cpp">int i;
cin&gt;&gt;i;
Foo&lt;i&gt; bar;
</code></pre>
<p>wenn ich 5 eingebe. Foo&lt;5&gt; existiert ja nicht...</p>
<blockquote>
<p>Heißt dass, das z.B bei Template-Funktionen der Compiler schon im voraus alles berechnet und durchgeht?</p>
</blockquote>
<p>Jein.<br />
Teilweise ja.<br />
Man kann viele Sachen per Templates direkt während dem Kompilieren berechnen.</p>
<p>Beispiel:</p>
<pre><code class="language-cpp">template&lt;int A, int B&gt;
class Calc {
public:
   static int result=A+B;
};
cout&lt;&lt;Calc&lt;3,4&gt;::result;
</code></pre>
<p>Hier wird der Compiler direkt 7 ausgeben. Das kann natürlich viel komplexer werden - mit Rekursion und komplexeren Operationen.</p>
<p>Aber es bedeutet nicht dass Templates automagisch alles zur Compiletime berechnen.</p>
<blockquote>
<p>Speziell bei Konstruktoren muss er aber doch trotzdem irgendwie schon im voraus berechnen, wie gross die zu erwartenden Objekte werden.</p>
</blockquote>
<p>Nein.<br />
Bring mal ein Beispiel wo du denkst, dass er das muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2296146</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2296146</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Tue, 05 Feb 2013 10:30:52 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische und statische Speicherbeschaffung, Klassen-Templates on Tue, 05 Feb 2013 10:46:53 GMT]]></title><description><![CDATA[<p>climits schrieb:</p>
<blockquote>
<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>In diesem Spezialfall, ja.</p>
<p>Aber was wenn du:</p>
<pre><code class="language-cpp">int i;
cin&gt;&gt;i;
int* p=new int[i];
</code></pre>
<p>schreibst?</p>
</blockquote>
<p>Ok, das verstehe ich. Wobei ich mich aber frage, warum genau in diesem Fall nicht auch statisch geht. Ist es deshalb, weil der übersetzte Code &quot;dicht&quot; liegen muss, und dass Array dann möglicherweise nicht mehr reinpasst, wenn es zu gross ist?</p>
</blockquote>
<p>Der gcc hat eine Erweiterung dafür, das geht prima.<br />
Das Array kann &quot;dicht&quot; auf den Stack gepackt werden, auch mehrere, da muss man nicht jede mögliche Größe reservieren. Das Risiko des Stackoverflows gibt es auch so.<br />
Es ist allerdings nicht mit dem Zero-Overhead-Prinzip vereinbar, da sich der Compiler extra die Größe merken muss. Bei n Arrays muss er wohl n-1 Größen Speichern und die Zugriffe werden schwieriger, weil die Größen addiert werden oder ebenfalls gespeichert werden müssen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2296148</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2296148</guid><dc:creator><![CDATA[nwp3]]></dc:creator><pubDate>Tue, 05 Feb 2013 10:46:53 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische und statische Speicherbeschaffung, Klassen-Templates on Tue, 05 Feb 2013 11:31:15 GMT]]></title><description><![CDATA[<p>Ok danke, das meiste hab ich denke ich verstanden.</p>
<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Nein.<br />
Bring mal ein Beispiel wo du denkst, dass er das muss.</p>
</blockquote>
<p>Wenn ich eine Klasse mit einem Array als member habe das statisch erzeugt werden soll, und einen Konstruktor mit dem dann per Parameter wieder die Grösse des Arrays bestimmt werden soll:</p>
<pre><code>class Ding {
Ding(int k);
int i;
int arr[i];
};
Ding::Ding(int k) 
: i(k) {...}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2296163</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2296163</guid><dc:creator><![CDATA[climits]]></dc:creator><pubDate>Tue, 05 Feb 2013 11:31:15 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische und statische Speicherbeschaffung, Klassen-Templates on Tue, 05 Feb 2013 11:41:37 GMT]]></title><description><![CDATA[<p>Du argumentierst mit einer nicht-standardkonformen Erweiterung eines speziellen Compilers, der ein C99-Feature umsetzt, dessen Existenz selbst viele C-Fans aufgrund vieler Probleme am liebsten totschweigen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2296167</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2296167</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 05 Feb 2013 11:41:37 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische und statische Speicherbeschaffung, Klassen-Templates on Tue, 05 Feb 2013 11:42:38 GMT]]></title><description><![CDATA[<p>Und in diesem Fall:</p>
<pre><code>class Foo
{
	int i;
	int arr[i];

public:
	Foo(int x)
		: i(x)
	{}
};

int main()
{
	int size;
	cin &gt;&gt; size;

	Foo f(size);

	return 0;
}
</code></pre>
<p>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2296168</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2296168</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Tue, 05 Feb 2013 11:42:38 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische und statische Speicherbeschaffung, Klassen-Templates on Tue, 05 Feb 2013 11:51:47 GMT]]></title><description><![CDATA[<p><code>Error: ‘i’ undeclared here (not in a function)</code> (C99)<br />
oder<br />
<code>Error: invalid use of non-static data member ‘Foo::i’</code> (C++)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2296173</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2296173</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 05 Feb 2013 11:51:47 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische und statische Speicherbeschaffung, Klassen-Templates on Tue, 05 Feb 2013 12:10:55 GMT]]></title><description><![CDATA[<p>mm, okay, das war wohl nichts. Aber immerhin noch was dazugelernt <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="😃"
    /><br />
Hab jetzt glaube ich alles begriffen. Danke für alle Antworten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2296181</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2296181</guid><dc:creator><![CDATA[climits]]></dc:creator><pubDate>Tue, 05 Feb 2013 12:10:55 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische und statische Speicherbeschaffung, Klassen-Templates on Tue, 05 Feb 2013 12:12:03 GMT]]></title><description><![CDATA[<p>Wenn nicht frag nach...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2296182</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2296182</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Tue, 05 Feb 2013 12:12:03 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische und statische Speicherbeschaffung, Klassen-Templates on Tue, 05 Feb 2013 12:26:22 GMT]]></title><description><![CDATA[<p>Variablen die nicht statisch sind müssen immer mit dem Konstruktor initialisiert werden, deshalb die Fehlermeldung. Und ein Array kann man scheins nur durch Angabe der Grösse deklarieren (und damit wahrscheinlich auch definieren), weil das wahrscheinlich auch zum Typ gehört, der schon zur Kompilierzeit feststehen muss. Die Grösse von Objekten der Klasse steht damit von vorneherein fest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2296194</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2296194</guid><dc:creator><![CDATA[climits]]></dc:creator><pubDate>Tue, 05 Feb 2013 12:26:22 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische und statische Speicherbeschaffung, Klassen-Templates on Tue, 05 Feb 2013 12:29:50 GMT]]></title><description><![CDATA[<blockquote>
<p>Und ein Array kann man scheins nur durch Angabe der Grösse deklarieren (und damit wahrscheinlich auch definieren), weil das wahrscheinlich auch zum Typ gehört, der schon zur Kompilierzeit feststehen muss. Die Grösse von Objekten der Klasse steht damit von vorneherein fest.</p>
</blockquote>
<p>So ist es.</p>
<blockquote>
<p>Variablen die nicht statisch sind müssen immer mit dem Konstruktor initialisiert werden, deshalb die Fehlermeldung.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2296195</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2296195</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 05 Feb 2013 12:29:50 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische und statische Speicherbeschaffung, Klassen-Templates on Tue, 05 Feb 2013 12:38:16 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
</blockquote>
<p>Also ich mein, sie müssen nicht unbedingt mit dem Konstruktor initialisiert werden, aber sie dürfen nicht innerhalb der Klassendefinition initialisiert werden, also z.B:</p>
<pre><code>class A {
int i = 3;
int k = i;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2296199</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2296199</guid><dc:creator><![CDATA[climits]]></dc:creator><pubDate>Tue, 05 Feb 2013 12:38:16 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische und statische Speicherbeschaffung, Klassen-Templates on Tue, 05 Feb 2013 13:00:52 GMT]]></title><description><![CDATA[<p>Jain. Im Prinzip hast du Recht. Jedoch wurde dein Beispiel</p>
<pre><code>class A {
int i = 3;
int k = i;
};
</code></pre>
<p>als Syntaxerweiterung in C++11 eingeführt und macht das, was man intuitiv erwarten würde. Das ist jedoch eher eine schicke Art und Weise, einen Konstruktor zu schreiben. Der Code wird aber natürlich erst bei der tatsächlichen Erzeugung eines Objektes ausgeführt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2296206</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2296206</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 05 Feb 2013 13:00:52 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische und statische Speicherbeschaffung, Klassen-Templates on Tue, 05 Feb 2013 14:10:32 GMT]]></title><description><![CDATA[<p>In C++ 2011 geht das also? Scheinbar muss ich mal mein Code::Blocks aktualisieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2296222</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2296222</guid><dc:creator><![CDATA[climits]]></dc:creator><pubDate>Tue, 05 Feb 2013 14:10:32 GMT</pubDate></item><item><title><![CDATA[Reply to Dynamische und statische Speicherbeschaffung, Klassen-Templates on Tue, 05 Feb 2013 14:46:27 GMT]]></title><description><![CDATA[<p>climits schrieb:</p>
<blockquote>
<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Selbes Beispiel wie oben:</p>
<pre><code class="language-cpp">int i;
cin&gt;&gt;i;
Ding&lt;char, i&gt; einDing; //geht nicht
Ding&lt;char&gt; einDing(i); //geht sehr wohl
</code></pre>
</blockquote>
<p>Warum geht Ersteres pauschal nicht? Wenn i zum Beispiel nicht bestimmend für die Grösse eines Arrays oder ähnlichem ist, dann weiß der Compiler doch sowieso immer, wie gross daraus erzeugte Objekte werden.</p>
</blockquote>
<p>&quot;i&quot; kann in C++ &quot;bestimmend&quot; für alles mögliche sein. Es kann z.B. sein dass <code>Ding&lt;char, 1&gt;</code> eine Funktion <code>Foo</code> hat (also <code>Ding&lt;char, 1&gt;::Foo</code> existiert), <code>Ding&lt;char, 0&gt;</code> aber nicht (also <code>Ding&lt;char, 0&gt;::Foo</code> existiert nicht).<br />
Weiters sind <code>Ding&lt;char, 1&gt;</code> und <code>Ding&lt;char, 0&gt;</code> vollkommen <em>unverwandte</em> Typen. D.h. es gibt gar keine Möglichkeit in C++ über ein <code>Ding&lt;char, wurstWasHierSteht&gt;</code> zu sprechen -- abgesehen natürlich über weitere Templates.</p>
<p>Nur da Templates in C++ nicht zur Laufzeit ausgewertet werden können beisst sich der Schwanz hier in den Hund.</p>
<p>Es gibt allerdings eine Sprachgruppe die in dieser Richtung weit mehr erlaubt als C++, und das sind die funktionalen Sprachen.</p>
<p>C++ geht das ganze einfach nach dem Motto an &quot;wir wollen statisch effizienten Code erzeugen können&quot; an, und verbietet daher alles (viel) was das verhindern würde. Und das schliesst die dynamische Auswertung von Templates mit ein.</p>
<p>Viele funktionale Sprachen gehen die Sache nach dem Motto &quot;wir wollen dass möglichst viel geht&quot; an, und nehmen dafür in Kauf dass man ziemlich komplexe Interpreter/JIT Kombinationen, üblicherweise gepaar mit nem Garbage-Collector + schlauen Caching-Algorithmus braucht um sie in annehmbarer Zeit ausführen zu können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2296238</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2296238</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 05 Feb 2013 14:46:27 GMT</pubDate></item></channel></rss>