<?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[Membervariablen als Array ohne Kopierung]]></title><description><![CDATA[<p>Hallo!<br />
Angenommen ich habe ein Klasse wie</p>
<pre><code class="language-cpp">class MyClass
{
public:
 uint* getMembers();
private:
 uint a;
 uint b;
 uint c;
}
</code></pre>
<p>Ich möchte nun eine Funktion schreiben, die a, b und c zurückgibt. Kann ich diese so</p>
<pre><code>uint* getMembers()
{
 return a&amp;;
}
</code></pre>
<p>realisieren, sodass bei</p>
<pre><code>uint* data = obj.getMembers();
</code></pre>
<p>data[0] == a; data[1] == b und data[2] == c</p>
<p>Oder anders gefragt: Kann C++ garantieren, dass selbst bei eingeschalteter Optimierung die Member in genau dieser Reihenfolge im Speicher vorkommen und dass auf die eine primitive Membervariable direkt die andere folgt?</p>
<p>Falls das nicht funktioniert, gibt es soetwas wie std::auto_ptr für arrays, sodass z.B.</p>
<pre><code>auto_array_ptr&lt;uint&gt; getMembers()
{
  uint array[] = new uint[3];
  array[0] = a;
  array[1] = b;
  array[2] = c;
  return auto_array_ptr&lt;uint&gt;(array);
}
</code></pre>
<p>Es müsste eben sichergestellt werden, dass das dynamisch allozierte Array nach dem Austritt aus dem Scope gelöscht wird.</p>
<p>MfG, Golem</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/237675/membervariablen-als-array-ohne-kopierung</link><generator>RSS for Node</generator><lastBuildDate>Wed, 23 Sep 2026 09:20:29 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/237675.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 31 Mar 2009 14:51:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Membervariablen als Array ohne Kopierung on Tue, 31 Mar 2009 14:51:04 GMT]]></title><description><![CDATA[<p>Hallo!<br />
Angenommen ich habe ein Klasse wie</p>
<pre><code class="language-cpp">class MyClass
{
public:
 uint* getMembers();
private:
 uint a;
 uint b;
 uint c;
}
</code></pre>
<p>Ich möchte nun eine Funktion schreiben, die a, b und c zurückgibt. Kann ich diese so</p>
<pre><code>uint* getMembers()
{
 return a&amp;;
}
</code></pre>
<p>realisieren, sodass bei</p>
<pre><code>uint* data = obj.getMembers();
</code></pre>
<p>data[0] == a; data[1] == b und data[2] == c</p>
<p>Oder anders gefragt: Kann C++ garantieren, dass selbst bei eingeschalteter Optimierung die Member in genau dieser Reihenfolge im Speicher vorkommen und dass auf die eine primitive Membervariable direkt die andere folgt?</p>
<p>Falls das nicht funktioniert, gibt es soetwas wie std::auto_ptr für arrays, sodass z.B.</p>
<pre><code>auto_array_ptr&lt;uint&gt; getMembers()
{
  uint array[] = new uint[3];
  array[0] = a;
  array[1] = b;
  array[2] = c;
  return auto_array_ptr&lt;uint&gt;(array);
}
</code></pre>
<p>Es müsste eben sichergestellt werden, dass das dynamisch allozierte Array nach dem Austritt aus dem Scope gelöscht wird.</p>
<p>MfG, Golem</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1688888</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1688888</guid><dc:creator><![CDATA[Golem86]]></dc:creator><pubDate>Tue, 31 Mar 2009 14:51:04 GMT</pubDate></item><item><title><![CDATA[Reply to Membervariablen als Array ohne Kopierung on Tue, 31 Mar 2009 17:29:04 GMT]]></title><description><![CDATA[<p>Golem86 schrieb:</p>
<blockquote>
<p>Oder anders gefragt: Kann C++ garantieren, dass selbst bei eingeschalteter Optimierung die Member in genau dieser Reihenfolge im Speicher vorkommen und dass auf die eine primitive Membervariable direkt die andere folgt?</p>
</blockquote>
<p>Es wird vom C++-Standard garantiert, dass die Reihenfolge von Membern unter dem gleichen Zugriffsspezifizierer der Deklaration entspricht. Aber bezüglich Alignment können Optimierungen Probleme bereiten. Normalerweise verlässt man sich aber auch nicht auf die Ausrichtung innerhalb der Klasse, da man über den Variablennamen zugreift. Vielleicht bringt dir jedoch <a href="http://www.cplusplus.com/reference/clibrary/cstddef/offsetof.html" rel="nofollow">offsetof</a> etwas.</p>
<p>Golem86 schrieb:</p>
<blockquote>
<p>Falls das nicht funktioniert, gibt es soetwas wie std::auto_ptr für arrays [...] Es müsste eben sichergestellt werden, dass das dynamisch allozierte Array nach dem Austritt aus dem Scope gelöscht wird.</p>
</blockquote>
<p>Es gäbe zwar <code>boost::shared_array</code> bzw. <code>boost::scoped_array</code> .</p>
<p>Aber das scheint mir der falsche Ansatz zu sein. Warum benötigst du gleich alle drei Membervariablen auf einmal? Wäre es nicht sinnvoller, die auch in einem Array zu speichern?</p>
<p>Sonst - was mir die beste Möglichkeit scheint - könntest du auch <code>std::tr1::array</code> ( <code>boost::array</code> ) oder STL-Container zurückgeben, dann müsstest du dich nicht um den Speicher kümmern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1688971</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1688971</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 31 Mar 2009 17:29:04 GMT</pubDate></item><item><title><![CDATA[Reply to Membervariablen als Array ohne Kopierung on Tue, 31 Mar 2009 19:08:48 GMT]]></title><description><![CDATA[<p>Golem86 schrieb:</p>
<blockquote>
<p>Es müsste eben sichergestellt werden, dass das dynamisch allozierte Array nach dem Austritt aus dem Scope gelöscht wird.</p>
</blockquote>
<p>Was spricht gegen einen std::vector?<br />
Mal davon abgesehen dass du eh so gut wie nie diekten Zugriff auf member geben solltest. Das riecht ziemlich arg nach einem Designfehler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1689006</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1689006</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 31 Mar 2009 19:08:48 GMT</pubDate></item><item><title><![CDATA[Reply to Membervariablen als Array ohne Kopierung on Tue, 31 Mar 2009 21:17:55 GMT]]></title><description><![CDATA[<p>Was spricht gegen boost::tuple bzw. einer einfachen Struktur mit 3 ints drinnen <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/1689078</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1689078</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 31 Mar 2009 21:17:55 GMT</pubDate></item></channel></rss>