<?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[Speicheradressen in Schleifen]]></title><description><![CDATA[<p>Hi,</p>
<pre><code class="language-cpp">for (int i = 0; i &lt; 10; i++) {
    std::pair&lt;int, int&gt; pair = std::make_pair(i, i+1);
    std::cout &lt;&lt; &amp;pair &lt;&lt; std::endl;
}
</code></pre>
<p>liefert mir als Ausgabe:</p>
<pre><code>0x7fffa6ff6ee0                                       
0x7fffa6ff6ee0                                       
0x7fffa6ff6ee0                                       
0x7fffa6ff6ee0                                       
0x7fffa6ff6ee0                                       
0x7fffa6ff6ee0                                       
0x7fffa6ff6ee0                                       
0x7fffa6ff6ee0                                       
0x7fffa6ff6ee0                                       
0x7fffa6ff6ee0
</code></pre>
<p>d.h., die in der for-Schleife erzeugten pair-Objekte werden wohl alle an die gleiche Stelle im Speicher abgelegt.<br />
Ist es möglich, dass die Objekte jeweils eine andere Speicheradresse zugewiesen bekommen? Konkret möchte ich in etwa sowas machen:</p>
<pre><code class="language-cpp">std::priority_queue&lt;pair&lt;int, int&gt;*, vector&lt;pair&lt;int, int&gt;* &gt;, compare_pairs&gt; pq;
for (...)
{
  std::pair&lt;int, int&gt; pair = std::make_pair(i, i+1);
  pq.push(&amp;pair);
  ...
}
</code></pre>
<p>mit</p>
<pre><code class="language-cpp">struct compare_pairs
{
  bool operator()(const pair&lt;int, int&gt;* a, const pair&lt;int, int&gt;* b)
  const
  {
    if (a-&gt;second == b-&gt;second) return a-&gt;first &gt; b-&gt;first;
    return a-&gt;second &lt; b-&gt;second;
  }
};
</code></pre>
<p>Die Reihenfolge der pair-Objekte in der priority-queue entspricht aber überhaupt nicht der gewünschten Reihenfolge (weil eben immer nur auf die eine Speicheradresse zugegriffen wird?)<br />
Jemand ne Idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/282593/speicheradressen-in-schleifen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 23 Aug 2026 01:41:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/282593.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 22 Feb 2011 19:00:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Speicheradressen in Schleifen on Tue, 22 Feb 2011 19:00:22 GMT]]></title><description><![CDATA[<p>Hi,</p>
<pre><code class="language-cpp">for (int i = 0; i &lt; 10; i++) {
    std::pair&lt;int, int&gt; pair = std::make_pair(i, i+1);
    std::cout &lt;&lt; &amp;pair &lt;&lt; std::endl;
}
</code></pre>
<p>liefert mir als Ausgabe:</p>
<pre><code>0x7fffa6ff6ee0                                       
0x7fffa6ff6ee0                                       
0x7fffa6ff6ee0                                       
0x7fffa6ff6ee0                                       
0x7fffa6ff6ee0                                       
0x7fffa6ff6ee0                                       
0x7fffa6ff6ee0                                       
0x7fffa6ff6ee0                                       
0x7fffa6ff6ee0                                       
0x7fffa6ff6ee0
</code></pre>
<p>d.h., die in der for-Schleife erzeugten pair-Objekte werden wohl alle an die gleiche Stelle im Speicher abgelegt.<br />
Ist es möglich, dass die Objekte jeweils eine andere Speicheradresse zugewiesen bekommen? Konkret möchte ich in etwa sowas machen:</p>
<pre><code class="language-cpp">std::priority_queue&lt;pair&lt;int, int&gt;*, vector&lt;pair&lt;int, int&gt;* &gt;, compare_pairs&gt; pq;
for (...)
{
  std::pair&lt;int, int&gt; pair = std::make_pair(i, i+1);
  pq.push(&amp;pair);
  ...
}
</code></pre>
<p>mit</p>
<pre><code class="language-cpp">struct compare_pairs
{
  bool operator()(const pair&lt;int, int&gt;* a, const pair&lt;int, int&gt;* b)
  const
  {
    if (a-&gt;second == b-&gt;second) return a-&gt;first &gt; b-&gt;first;
    return a-&gt;second &lt; b-&gt;second;
  }
};
</code></pre>
<p>Die Reihenfolge der pair-Objekte in der priority-queue entspricht aber überhaupt nicht der gewünschten Reihenfolge (weil eben immer nur auf die eine Speicheradresse zugegriffen wird?)<br />
Jemand ne Idee?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2024912</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2024912</guid><dc:creator><![CDATA[rotzenplotz]]></dc:creator><pubDate>Tue, 22 Feb 2011 19:00:22 GMT</pubDate></item><item><title><![CDATA[Reply to Speicheradressen in Schleifen on Tue, 22 Feb 2011 19:22:19 GMT]]></title><description><![CDATA[<p>Warum überhaupt Zeiger? Benutze lediglich <code>std::pair&lt;int, int&gt;</code> . Ein <code>operator&lt;</code> wird übrigens auch schon von <code>std::pair</code> bereitgestellt.</p>
<p>Und Zeiger auf lokale Variablen werden ungültig, sobald der Block verlassen wird (also nach jedem Schleifendurchgang). Dein zweiter Code resultiert daher in undefiniertem Verhalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2024923</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2024923</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 22 Feb 2011 19:22:19 GMT</pubDate></item><item><title><![CDATA[Reply to Speicheradressen in Schleifen on Tue, 22 Feb 2011 19:32:13 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Warum überhaupt Zeiger? Benutze lediglich <code>std::pair&lt;int, int&gt;</code> . Ein <code>operator&lt;</code> wird übrigens auch schon von <code>std::pair</code> bereitgestellt.</p>
<p>Und Zeiger auf lokale Variablen werden ungültig, sobald der Block verlassen wird (also nach jedem Schleifendurchgang). Dein zweiter Code resultiert daher in undefiniertem Verhalten.</p>
</blockquote>
<p>Weil ich es möglichst performant programmieren möchte und sehr viele pair-Objekte erzeuge. War/bin der Meinung, dass das mit Zeigern schneller geht. Insbesondere bei <code>pq.push(&amp;pair);</code> sollte das schon Vorteile bringen, da keine Kopie des pair-Objektes erzeugt werden muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2024934</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2024934</guid><dc:creator><![CDATA[rotzenplotz]]></dc:creator><pubDate>Tue, 22 Feb 2011 19:32:13 GMT</pubDate></item><item><title><![CDATA[Reply to Speicheradressen in Schleifen on Tue, 22 Feb 2011 19:38:46 GMT]]></title><description><![CDATA[<p>rotzenplotz schrieb:</p>
<blockquote>
<p>Weil ich es möglichst performant programmieren möchte und sehr viele pair-Objekte erzeuge. War/bin der Meinung, dass das mit Zeigern schneller geht.</p>
</blockquote>
<p>Ich kann immer noch nicht verstehen, warum so viele Leute sich mühsamen, fehlerhaften Code zurechtfrickeln mit der Begründung, sie seien auf die Performance angewiesen. Dein Post ist ein Musterbeispiel für Premature Optimization.</p>
<p>Zeiger sind gerade bei <code>pair&lt;int, int&gt;</code> nicht schneller. Im Gegenteil. Ein Zeiger ist selbst wahrscheinlich gleich gross wie ein <code>int</code> , der gesparte Kopieraufwand hält sich also in Grenzen. Im Gegenzug kommt die dauernde Dereferenzierung dazu. Und falls du das Ganze noch korrekt programmieren würdest, hättest du dynamische Speicherverwaltung, was den Overhead pro <code>std::pair</code> erst recht in die Höhe schiessen lässt.</p>
<p>rotzenplotz schrieb:</p>
<blockquote>
<p>Insbesondere bei <code>pq.push(&amp;pair);</code> sollte das schon Vorteile bringen, da keine Kopie des pair-Objektes erzeugt werden muss.</p>
</blockquote>
<p>Schau dir nochmals an, wie das mit Gültigkeitsbereichen funktioniert. Der Code ist wie gesagt fehlerhaft.</p>
<p>Bitte tu uns allen einen Gefallen und verwende Kopien. Der Code wird übersichtlicher, korrekter und zudem schneller.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2024937</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2024937</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 22 Feb 2011 19:38:46 GMT</pubDate></item><item><title><![CDATA[Reply to Speicheradressen in Schleifen on Tue, 22 Feb 2011 19:40:07 GMT]]></title><description><![CDATA[<p>Wenn die Dinger nicht kopiert werden sollen, erstell doch ein Array auf dem Stack.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2024939</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2024939</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Tue, 22 Feb 2011 19:40:07 GMT</pubDate></item><item><title><![CDATA[Reply to Speicheradressen in Schleifen on Tue, 22 Feb 2011 21:13:23 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>rotzenplotz schrieb:</p>
<blockquote>
<p>Weil ich es möglichst performant programmieren möchte und sehr viele pair-Objekte erzeuge. War/bin der Meinung, dass das mit Zeigern schneller geht.</p>
</blockquote>
<p>Ich kann immer noch nicht verstehen, warum so viele Leute sich mühsamen, fehlerhaften Code zurechtfrickeln mit der Begründung, sie seien auf die Performance angewiesen. Dein Post ist ein Musterbeispiel für Premature Optimization.</p>
<p>Zeiger sind gerade bei <code>pair&lt;int, int&gt;</code> nicht schneller. Im Gegenteil. Ein Zeiger ist selbst wahrscheinlich gleich gross wie ein <code>int</code> , der gesparte Kopieraufwand hält sich also in Grenzen. Im Gegenzug kommt die dauernde Dereferenzierung dazu. Und falls du das Ganze noch korrekt programmieren würdest, hättest du dynamische Speicherverwaltung, was den Overhead pro <code>std::pair</code> erst recht in die Höhe schiessen lässt.</p>
<p>rotzenplotz schrieb:</p>
<blockquote>
<p>Insbesondere bei <code>pq.push(&amp;pair);</code> sollte das schon Vorteile bringen, da keine Kopie des pair-Objektes erzeugt werden muss.</p>
</blockquote>
<p>Schau dir nochmals an, wie das mit Gültigkeitsbereichen funktioniert. Der Code ist wie gesagt fehlerhaft.</p>
<p>Bitte tu uns allen einen Gefallen und verwende Kopien. Der Code wird übersichtlicher, korrekter und zudem schneller.</p>
</blockquote>
<p>Naja, zu dem Thema, wie der Code letztendlich aussehen soll, gibt's wahrscheinlich viele Meinungen. Aber wenn man es halt so lernt, dass man für alles was über primitive Datentypen hinausgeht, Zeiger verwenden sollte, versucht man es natürlich auch so zu machen. Werde mich weiter schlau machen - dir danke für deine Mühe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2025000</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2025000</guid><dc:creator><![CDATA[rotzenplotz]]></dc:creator><pubDate>Tue, 22 Feb 2011 21:13:23 GMT</pubDate></item><item><title><![CDATA[Reply to Speicheradressen in Schleifen on Tue, 22 Feb 2011 21:17:20 GMT]]></title><description><![CDATA[<p>rotzenplotz schrieb:</p>
<blockquote>
<p>Naja, zu dem Thema, wie der Code letztendlich aussehen soll, gibt's wahrscheinlich viele Meinungen.</p>
</blockquote>
<p>Nein, wenn der Code so offensichtlich fehlerhaft ist, sind sich Leute mit Ahnung von C++ ziemlich einig.</p>
<p>rotzenplotz schrieb:</p>
<blockquote>
<p>Aber wenn man es halt so lernt, dass man für alles was über primitive Datentypen hinausgeht, Zeiger verwenden sollte, versucht man es natürlich auch so zu machen.</p>
</blockquote>
<p>Vergiss das ganz schnell wieder. So pauschal ist das nämlich grober Unfug.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2025005</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2025005</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 22 Feb 2011 21:17:20 GMT</pubDate></item></channel></rss>