<?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[auto_ptr Magie]]></title><description><![CDATA[<p>Ich versteh nicht wirklich wie auto_ptr implementiert ist. Könnte mir bitte jemand erklären was das funktioniert.</p>
<p>Folgendes ist eine vereinfachte Version von auto_ptr:</p>
<pre><code class="language-cpp">class Ref{};
class Ptr{
public:
	Ptr(){}
	Ptr(Ref){}
	Ptr(Ptr&amp;){}

	Ptr&amp;operator=(Ref){}
	Ptr&amp;operator=(Ptr&amp;){}

	operator Ref(){}
};
</code></pre>
<p>Ptr(const Ptr&amp;) un op=(const Ptr&amp;) dürfen nicht private sein, sonst geht es nicht. Deswegen glaub ich werden die default erzeugt.</p>
<p>Wieso compiliert folgendes nicht:</p>
<pre><code class="language-cpp">const Ptr a;
Ptr b(a);
</code></pre>
<p>Ptr(const Ptr&amp;) wurde doch vom Compiler default erzeugt oder etwa nicht? <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>
<p>Was spielt Ref da für eine Rolle? Wann greift es ein?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/165343/auto_ptr-magie</link><generator>RSS for Node</generator><lastBuildDate>Mon, 14 Sep 2026 19:28:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/165343.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 18 Nov 2006 21:59:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to auto_ptr Magie on Sat, 18 Nov 2006 21:59:44 GMT]]></title><description><![CDATA[<p>Ich versteh nicht wirklich wie auto_ptr implementiert ist. Könnte mir bitte jemand erklären was das funktioniert.</p>
<p>Folgendes ist eine vereinfachte Version von auto_ptr:</p>
<pre><code class="language-cpp">class Ref{};
class Ptr{
public:
	Ptr(){}
	Ptr(Ref){}
	Ptr(Ptr&amp;){}

	Ptr&amp;operator=(Ref){}
	Ptr&amp;operator=(Ptr&amp;){}

	operator Ref(){}
};
</code></pre>
<p>Ptr(const Ptr&amp;) un op=(const Ptr&amp;) dürfen nicht private sein, sonst geht es nicht. Deswegen glaub ich werden die default erzeugt.</p>
<p>Wieso compiliert folgendes nicht:</p>
<pre><code class="language-cpp">const Ptr a;
Ptr b(a);
</code></pre>
<p>Ptr(const Ptr&amp;) wurde doch vom Compiler default erzeugt oder etwa nicht? <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>
<p>Was spielt Ref da für eine Rolle? Wann greift es ein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1176874</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1176874</guid><dc:creator><![CDATA[Ben04]]></dc:creator><pubDate>Sat, 18 Nov 2006 21:59:44 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr Magie on Sat, 18 Nov 2006 22:22:41 GMT]]></title><description><![CDATA[<p>Ne, auto_ptr hat keinen Copy-Konstruktor für const auto_ptr&lt;T&gt;&amp;. Kopieren ist bei auto_ptr destruktiv. Sprich nur ein Autopointer verwaltet Speicher, nie zwei!</p>
<p><a href="http://www.gotw.ca/gotw/025.htm" rel="nofollow">http://www.gotw.ca/gotw/025.htm</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1176882</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1176882</guid><dc:creator><![CDATA[rüdiger]]></dc:creator><pubDate>Sat, 18 Nov 2006 22:22:41 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr Magie on Sat, 18 Nov 2006 22:33:14 GMT]]></title><description><![CDATA[<p><a href="http://www.henkessoft.de/C++/C++%20Fortgeschrittene/C++_Fortgeschrittene.htm#2.9._auto_ptr" rel="nofollow">http://www.henkessoft.de/C++/C++ Fortgeschrittene/C++_Fortgeschrittene.htm#2.9._auto_ptr</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1176885</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1176885</guid><dc:creator><![CDATA[Erhard Henkes]]></dc:creator><pubDate>Sat, 18 Nov 2006 22:33:14 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr Magie on Sat, 18 Nov 2006 22:41:51 GMT]]></title><description><![CDATA[<p>Danke für deine schnell Antwort, aber mir ist bewusst wie man <em>auto_ptr</em> benutzt und es einsetzt. Es geht mir drum zu verstehen wie dies hinter den Kulissen abläuft.</p>
<p>Vieleicht bringt es mehr wenn ich sag was ich machen will.</p>
<p>Ich hab eine Klasse <em>Foo</em> die an sich nur aus einem Zeiger besteht, also quasi ein schlauer Zeiger. Dieser Zeiger ist polymorph, das heißt der Type ist von einer Basisklasse <em>Base</em> abgeleitet, welche eine <em>clone</em> Funktion besitzt.</p>
<p>Diese <em>clone</em> Funktion ist sehr nützlich um <em>Foo</em> einen Copyctor zu verpassen. Nun stellt sich aber heraus, dass die <em>clone</em> Funktion sehr langsam sein kann. Das heißt Kopien müssen wenn nur möglich umgehen werden.</p>
<p>Viele Aufrufe von <em>clone</em> sind auch völlig überflüssig und diehnen nur dazu temporäre Objekte zu erzeugen. Darum wollte ich ein <em>auto_ptr</em> ähnliches Verhalten einbauen.</p>
<p>Ich wollte <em>Foo</em> 2 Methoden verpassen <em>consume</em> und <em>copy</em>. Die erste hebt einfach den Besitzt des Zeiger auf, wogegen die zweite auf <em>clone</em> zurück greift. <em>Foo</em> soll keinen impliciten Copyctor mehr haben.</p>
<pre><code class="language-cpp">class Base{
public:
  virtual Base*clone()const=0;
  virtual ~Base(){}
};

class Foo{
public:
  explicit Foo(Base*){...}

  Foo( ??? )

  ??? consume(){
    Base*ret = ptr;
    ptr = 0;
    return ret;
  }

  ??? copy()const{
    return ptr-&gt;clone();
  }

private:
  Foo(const Foo&amp;);
  Base*ptr;
};

// Beispiele

Foo f1(){
  Foo a;
  return a.consume();
}

Foo f2(const Foo&amp;a){
  return a.copy();
}

void f3(Foo a){
}

void f4(){
  Foo a;
  f3(a.copy());
  // a gültig, wurded gecloned.
  f3(a.consume());
  // a ungültig, Besitz wurde transferiert.
}
</code></pre>
<p>PS: Ich weiß, dass ein &quot;guter&quot; Compiler den Copyctor-Aufruf raushauen sollte. In den einfachen Beispielen schafft er dies auch aber bei komplexeren versagt meiner nur all zu gern. Diese unötigen <em>clone</em> Aufrüfe machen bei manchen Eingaben etwa 60% der gesamten Laufzeit aus, also egal wie viel zu riskant dies in die Hände eines fragilien Optimizers zu legen welcher bei jeder neuen Compilerversion auf einmal nicht mehr wollen könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1176890</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1176890</guid><dc:creator><![CDATA[Ben04]]></dc:creator><pubDate>Sat, 18 Nov 2006 22:41:51 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr Magie on Sun, 19 Nov 2006 00:57:41 GMT]]></title><description><![CDATA[<p>Wenn ich dich richtig verstehe willst du einen auto_ptr ohne copy-ctor aber mit clone Funktion. Sollte inetwa so gehen:</p>
<pre><code class="language-cpp">template&lt;class T&gt;
class my_ptr
{
public:
    my_ptr() : m_p(0) {} // leere instanz
    explicit my_ptr(T* p) : m_p(p) {} // neue instanz mit neuem T
    my_ptr(std::auto_ptr&lt;T&gt;&amp; p) : m_p(p.release()) {} // neue instanz übernimmt T von auto_ptr

    ~my_ptr() { tidy(); } // hau weg den scheiss

    // klonen
    std::auto_ptr&lt;T&gt; clone() const { return std::auto_ptr&lt;T&gt;(m_p-&gt;clone()); }

    // ownership abgeben (sollte vielleicht release heissen :) )
    std::auto_ptr&lt;T&gt; consume()
    {
        std::auto_ptr&lt;T&gt; newOwner(m_p);
        m_p = 0;
        return newOwner;
    }

    // zuweisen my_ptr = auto_ptr
    my_ptr&amp; operator = (std::auto_ptr&lt;T&gt;&amp; p)
    {
        tidy();
        m_p = p.release();
        return *this;
    }

private:
    // make noncopyable (alternativ z.B. von boost::noncopyable ableiten)
    my_ptr(my_ptr const&amp;); // nicht implementiert, bloss private damit keiner dran kann
    my_ptr&amp; operator = (my_ptr const&amp;); // nicht implementiert, bloss private damit keiner dran kann

    void tidy() { delete m_p; m_p = 0; } // freigeben, nullsetzen

    T* m_p;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1176925</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1176925</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 19 Nov 2006 00:57:41 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr Magie on Sun, 19 Nov 2006 10:37:15 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/7575">@Ben04</a></p>
<p>Guckst du hier:<br />
<a href="http://www.josuttis.com/libbook/auto_ptr.html" rel="nofollow">http://www.josuttis.com/libbook/auto_ptr.html</a><br />
<a href="http://www.awprofessional.com/content/images/020163371X/autoptrupdate%5Cauto_ptr_update.html" rel="nofollow">http://www.awprofessional.com/content/images/020163371X/autoptrupdate\auto_ptr_update.html</a></p>
<blockquote>
<p>Ptr(const Ptr&amp;) wurde doch vom Compiler default erzeugt oder etwa nicht?</p>
</blockquote>
<p>Nicht in deinem Beispiel. Deine Klasse Ptr hat einen Copy-Ctor (Ptr(Ptr&amp;) - ein Copy-Ctor ist ein Ctor, der eine Referenz auf ein Objekt der Klasse erwartet, wobei das Objekt beliebig const/volatile qualifiziert sein kann). Es wird keine andere Version mehr erstellt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1177014</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1177014</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Sun, 19 Nov 2006 10:37:15 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr Magie on Sun, 19 Nov 2006 11:18:19 GMT]]></title><description><![CDATA[<p>Du hast das richtig verstanden.</p>
<p>Deine Lösung sieht aber nur gut aus, ist in der Verwendung aber sehr schwerfällig.</p>
<pre><code class="language-cpp">Foo f1(){
  Foo a;
  return a.consume();
}
</code></pre>
<p>Kann kein <em>Foo</em> zurück geben. Könnte aber damit leben ein <em>auto_ptr</em> hinzuschreiben als Returntype.</p>
<pre><code class="language-cpp">void f3(Foo a){
}
</code></pre>
<p>Das geht nicht und darauf will ich nicht verzichten. Hierfür muss ein Copyctor von <em>Foo</em> public sein. Geht nicht anders.</p>
<blockquote>
<p>[12.1.10]<br />
A copy constructor for a class X is a constructor with a first parameter of type X&amp; or of type const X&amp;.</p>
</blockquote>
<p>Also besitzt auto_ptr ein auto_ptr(auto_ptr&amp;) welcher als Copyctor eingesetzt werden kann und es wird kein auto_ptr(const auto_ptr&amp;) erzeugt da bereits ein Copyctor. Dies ist verschieden von einem privaten auto_ptr(const auto_ptr&amp;).</p>
<pre><code class="language-cpp">const auto_ptr a;
auto_ptr b(a); // (1)
auto_ptr c(b); // (2)
</code></pre>
<p>(2) ist ein direkter Aufruf von auto_ptr(auto_ptr&amp;).<br />
Bei (1) wird als erstes auto_ptr(auto_ptr&amp;) versucht, schlägt aber wegen des fehlden const. Danach versucht der Compiler implicit zu Casten. Er findet auto_ptr -&gt; operator auto_ptr_ref() -&gt; auto_ptr_ref -&gt; auto_ptr(auto_ptr_ref) -&gt; auto_ptr. Dieser schlägt aber auch fehl, da operator auto_ptr_ref() nicht const ist.</p>
<pre><code class="language-cpp">auto_ptr foo();
auto_ptr a = foo();
</code></pre>
<p>Hier wird als erstes auto_ptr(auto_ptr&amp;) versucht. Schlägt aber fehl, da foo() ein Rvalue und kein Lvalue ist. Also wird wieder der Umweg über auto_ptr_ref gewählt wecher diesmal aber nicht fehl schlägt da foo() nicht const ist.</p>
<p>auto_ptr ist ja wirklich ein einziger Hack.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/30712">@Hume</a> Danke für die Links. Die könnten weiter helfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1177028</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1177028</guid><dc:creator><![CDATA[Ben04]]></dc:creator><pubDate>Sun, 19 Nov 2006 11:18:19 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr Magie on Sun, 19 Nov 2006 20:28:23 GMT]]></title><description><![CDATA[<p>Ben04 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void f3(Foo a){
}
</code></pre>
<p>Das geht nicht und darauf will ich nicht verzichten. Hierfür muss ein Copyctor von <em>Foo</em> public sein. Geht nicht anders.</p>
</blockquote>
<p>Dann machst du irgendwo einen Denkfehler. Entweder übergib &quot;Foo&amp;&quot;, oder übergib &quot;Foo const&amp;&quot;, oder übergib &quot;auto_ptr&lt;T&gt;&quot;.</p>
<p>Ausserdem hast du selbst geschrieben du willst den public copy-ctor weghaben. Ich denke du weisst selbst nicht so recht was du willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1177405</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1177405</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 19 Nov 2006 20:28:23 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr Magie on Sun, 19 Nov 2006 21:55:56 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Ben04 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void f3(Foo a){
}
</code></pre>
<p>Das geht nicht und darauf will ich nicht verzichten. Hierfür muss ein Copyctor von <em>Foo</em> public sein. Geht nicht anders.</p>
</blockquote>
<p>Dann machst du irgendwo einen Denkfehler. Entweder übergib &quot;Foo&amp;&quot;, oder übergib &quot;Foo const&amp;&quot;, oder übergib &quot;auto_ptr&lt;T&gt;&quot;.</p>
</blockquote>
<p>Ich gaub du kennst die Sprache nicht wirklich und hast es gar nicht mal ausprobiert.</p>
<pre><code class="language-cpp">#include&lt;memory&gt;
using std::auto_ptr;
class my_ptr
{
public:
    my_ptr();
    explicit my_ptr(int* p);
    my_ptr(std::auto_ptr&lt;int&gt;&amp; p);

    std::auto_ptr&lt;int&gt;copy() const;
    std::auto_ptr&lt;int&gt;consume();
    my_ptr&amp; operator = (std::auto_ptr&lt;int&gt;&amp; p);

private:
    my_ptr(my_ptr const&amp;);
    my_ptr&amp; operator = (my_ptr const&amp;);
};

void f3(my_ptr){
}

void f4(){
	my_ptr foo;
	f3(foo.copy());
}
</code></pre>
<p>Versuch es nur mal (aber nicht mit dem VC, der ist nämlich nicht standard-konform). Mein g++ spuckt da:</p>
<blockquote>
<p>In function <code>void f4()': 24: error: conversion from \</code>std::auto_ptr&lt;int&gt;' to non-scalar type `my_ptr' requested</p>
</blockquote>
<p>aus und hat damit vollkommen recht.</p>
<p>Es gibt kein Konvertirungs-Operator der ein std::auto_ptr&lt;int&gt; <strong>Rvalue</strong> in ein my_ptr verwandeln kann.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Ausserdem hast du selbst geschrieben du willst den public copy-ctor weghaben. Ich denke du weisst selbst nicht so recht was du willst.</p>
</blockquote>
<p>Will ich auch aber ohne copy-ctor kann man nun einmal keinen Type als Funktionsargument angeben als muss ein copy-ctor rein. Einfach oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1177463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1177463</guid><dc:creator><![CDATA[Ben04]]></dc:creator><pubDate>Sun, 19 Nov 2006 21:55:56 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr Magie on Sun, 19 Nov 2006 23:45:15 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich gaub du kennst die Sprache nicht wirklich und hast es gar nicht mal ausprobiert.</p>
</blockquote>
<p>Natürlich habe ich es nicht ausprobiert, ich weiss ja dass der Code funktioniert, mit dem Compiler mit dem ich arbeite, und das tut er auch (habe es _jetzt_ überprüft).</p>
<blockquote>
<p>Versuch es nur mal (aber nicht mit dem VC, der ist nämlich nicht standard-konform). Mein g++ spuckt da:</p>
</blockquote>
<p>Ok, genau da liegt das Problem, ich arbeite mit MSVC. Ich kenne zwar diese &quot;darf rvalue nicht an non-const-ref binden&quot; Regel, aber ich vergesse sie immer wieder, weil VC da eben nicht spuckt (solange man ihm nicht die language extensions ausdreht), und weil diese Regel vollkommen blöd und unnötig ist. Es ist eine von den &quot;user davor schützen unfug zu machen&quot; Regeln die keinerlei technischen Background hat, dafür aber oft sehr lästig wird. Im übrigen ist auch diese dumme Regel der Grund warum der hässliche Hack bei auto_ptr notwendig ist. Ok, das hilft dir nicht weiter, das weiss ich schon.</p>
<p>Ok, also brauchst du einen copy-ctor. Nu bist du aber wieder am Anfang, denn wenn du einen copy-ctor definieren willst, dann wird der wohl oder übel das kontrollierte Objekt kopieren müssen. Ich sehe keinen anderen Weg. Die vielen unnötigen Kopien kannst du aber trotzdem loswerden indem du statt &quot;Foo&quot; ein &quot;Foo const&amp;&quot; übergibst - oder anders gesagt: indem du Funktionen die ein &quot;Foo&quot; nehmen so umschreibst dass sie ein &quot;Foo const&amp;&quot; nehmen. Durch die &quot;copy&quot; (oder &quot;clone&quot;) Methode kann die Funktion ja jederzeit eine Kopie machen wenn sie das möchte, bzw. auch einfach den copy-ctor (den es ja jetzt gibt) verwenden um aus &quot;Foo const&amp;&quot; ein &quot;Foo&quot; zu machen. Wenn es etwas gibt was dich an dieser Alternative stört, dann bitte sag was. Aber nicht bloss wieder &quot;ich will einfach per value übergeben&quot; - das ist nämlich für sich genommen noch kein Grund.</p>
<p>Ich arbeite z.B. viel mit boost::shared_ptr, und die übergeben ich auch immer bloss per const-ref, da eine Kopie etwas teuer kommt (braucht zumindest einen interlocked Befehl, und nochmal einem im dtor für die Kopie, und interlocked Befehle sind eben sehr langsam).<br />
(Ausgenommen dort wo ich den shared_ptr als output Parameter brauche natürlich, dort muss es ja eine non-const-ref sein)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1177503</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1177503</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 19 Nov 2006 23:45:15 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr Magie on Mon, 20 Nov 2006 17:59:58 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Ok, also brauchst du einen copy-ctor. Nu bist du aber wieder am Anfang, denn wenn du einen copy-ctor definieren willst, dann wird der wohl oder übel das kontrollierte Objekt kopieren müssen. Ich sehe keinen anderen Weg. Die vielen unnötigen Kopien kannst du aber trotzdem loswerden indem du statt &quot;Foo&quot; ein &quot;Foo const&amp;&quot; übergibst - oder anders gesagt: indem du Funktionen die ein &quot;Foo&quot; nehmen so umschreibst dass sie ein &quot;Foo const&amp;&quot; nehmen. Durch die &quot;copy&quot; (oder &quot;clone&quot;) Methode kann die Funktion ja jederzeit eine Kopie machen wenn sie das möchte, bzw. auch einfach den copy-ctor (den es ja jetzt gibt) verwenden um aus &quot;Foo const&amp;&quot; ein &quot;Foo&quot; zu machen. Wenn es etwas gibt was dich an dieser Alternative stört, dann bitte sag was.</p>
</blockquote>
<p>Es stört mich, dass man keine Werte zurückgeben kann. Ok man kann ein Foo&amp; Parameter nutzen um die Ausgabe zu machen aber erstens ist es nicht schön und zweitens bezahlt man haufenweise unötige Defaultkonstruktoren (der Pointer soll nämlich auch immer non 0 sein).</p>
<p>Hab es nun so gemacht, dass Foo sich wie auto_ptr verhält (also der gleiche Hack) und noch zusätzlich eine copy/clone Methode hat. Suboptimal aber kann damit leben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1177980</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1177980</guid><dc:creator><![CDATA[Ben04]]></dc:creator><pubDate>Mon, 20 Nov 2006 17:59:58 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr Magie on Mon, 20 Nov 2006 18:18:12 GMT]]></title><description><![CDATA[<blockquote>
<p>Es stört mich, dass man keine Werte zurückgeben kann.</p>
</blockquote>
<p>Ok, das verstehe ich dann. Nur fürs Parameter übergeben hätte ich nicht ganz verstanden wieso es störend ist &quot;Foo&quot; durch &quot;Foo const&amp;&quot; ersetzen zu müssen.</p>
<p>Was genau machst du eigentlich damit (bin bloss neugierig)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1177999</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1177999</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 20 Nov 2006 18:18:12 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr Magie on Tue, 21 Nov 2006 18:31:24 GMT]]></title><description><![CDATA[<p>Erstellung eines Parsebaums aus einem Textstrom, anschließender Umformung des Baumes und Wiederausgabe als Text und Graphik. Wenn es genauer sein soll schau dir einfach die momentane Version an <a href="http://www.dhost.info/voodoocpp/down/raexpr.exe" rel="nofollow">http://www.dhost.info/voodoocpp/down/raexpr.exe</a></p>
<p>Muss den Source code aber recht tiefgreifend umstrukturiren.</p>
<p>Hab jetzt den Parserteil umgestellt. Von ursprünglich etwa 32 clone Aufrufe für ein Testbeispiel sind keine mehr geblieben. Bin mal gespannt wie lange (a+b)^100 noch brauchen wird wenn die clone Aufrufe bis auf ein Minimum reduciert sind.</p>
<blockquote>
<p>Nur fürs Parameter übergeben hätte ich nicht ganz verstanden wieso es störend ist &quot;Foo&quot; durch &quot;Foo const&amp;&quot; ersetzen zu müssen.</p>
</blockquote>
<p>Foo const&amp; kann aber auch oft ein temporäres Objekt verstecken daher ist es nicht schlecht sich darüber Gedanken zu machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1178723</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1178723</guid><dc:creator><![CDATA[Ben04]]></dc:creator><pubDate>Tue, 21 Nov 2006 18:31:24 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr Magie on Tue, 21 Nov 2006 20:51:05 GMT]]></title><description><![CDATA[<p>Ok, danke für die Info.</p>
<p>Noch ne blöde Frage: hast du dir überlegt vielleicht anstelle dieses &quot;Foo Monsters&quot; einfach copy-on-write zu verwenden, einfach mit reference counting? Beim schreiben/ändern: wenn refs == 1 dann gleich ändern, sonst kopieren und kopie ändern.<br />
Solange alles single threaded ist, ist reference counting sehr schnell.</p>
<p>Dann kann das &quot;Foo&quot; objekt quasi beliebig oft kopiert werden, ist ja klein und geht schnell, und das Kopieren des kontrollierten Objektes passiert ja erst dort wo es notwendig ist.</p>
<p>Ist natürlich nicht immer anwendbar, aber bevor ich sowas wie das worüber hier diskutiert wurde hernehme überlege ich mir 10x obs da nicht was besseres gibt was nicht so hässlich ist, aber genauso schnell (oder sogar schneller).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1178805</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1178805</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 21 Nov 2006 20:51:05 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr Magie on Tue, 21 Nov 2006 21:21:36 GMT]]></title><description><![CDATA[<blockquote>
<p>Noch ne blöde Frage: hast du dir überlegt vielleicht anstelle dieses &quot;Foo Monsters&quot; einfach copy-on-write zu verwenden, einfach mit reference counting? Beim schreiben/ändern: wenn refs == 1 dann gleich ändern, sonst kopieren und kopie ändern. Solange alles single threaded ist, ist reference counting sehr schnell.</p>
</blockquote>
<p>Wenns denn so einfach wäre... Hatte das im ersten Prototype drin. Das Referencezählen spürt man später an der Geschindigkeit. Wäre aber vernachlässigbar wenn es denn das Denken ersparen würde ob man nun kopieren muss oder nicht. Tut es aber nur meistens, cyclistische Reference machen sehr viel Ärger und führen zu schwer zu finden Fehlern. Also muss ich eh Denken wieso dann für das Referencezählen zahlen? Würd mir das &quot;consume&quot; noch wünschen da es dann ein Compilefehler geben würde wenn ich es doch einmal vergessen würde. Aber man kann nicht alles haben.</p>
<p>Die auto_ptr Mechanik bietet sich auch gerade zu an da es nur sehr, sehr selten zwei Besitzer gibt. Der Besitz wird immer nur transferiert und eben von Zeit zu Zeit wird auch mal dubliziert.</p>
<p>Und ein Monster ist dieses Foo wirklich nicht, besteht aus etwa 30 Zeilen mit Implementirung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1178823</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1178823</guid><dc:creator><![CDATA[Ben04]]></dc:creator><pubDate>Tue, 21 Nov 2006 21:21:36 GMT</pubDate></item><item><title><![CDATA[Reply to auto_ptr Magie on Wed, 22 Nov 2006 02:19:42 GMT]]></title><description><![CDATA[<p>Ben04 schrieb:</p>
<blockquote>
<p>Die auto_ptr Mechanik bietet sich auch gerade zu an da es nur sehr, sehr selten zwei Besitzer gibt. Der Besitz wird immer nur transferiert und eben von Zeit zu Zeit wird auch mal dubliziert.</p>
<p>Und ein Monster ist dieses Foo wirklich nicht, besteht aus etwa 30 Zeilen mit Implementirung.</p>
</blockquote>
<p>Ich meinte auch nicht die grösse, sondern die Logik. Ich vermeine z.B. auch auto_ptr, es sei denn als Returnwert von diversen Factory Methoden oder ähnlichem.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1178897</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1178897</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 22 Nov 2006 02:19:42 GMT</pubDate></item></channel></rss>