<?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[Kurze Frage zu Unions]]></title><description><![CDATA[<p>Hey Community,</p>
<p>wie der Titel bereits sagt, habe ich eine kurze Frage zu Unions. Ich habe DERMAßEN wenig mit Unions bisher gerabeitet, ich bin mir echt nicht 100% sicher. Kurz zu meinem Problem:</p>
<p>Ich habe eine Klasse die einen &quot;Header&quot; repräsentiert, von dem später einige Informationen in ein File geschrieben werden. Darunter sind Offsets in dem File die wahlweise in 32 oder 64 Bit Länge (uint32_t / uint64_t) geschrieben werden. Welche Länge es am Ende ist bleibt unabhängig vom darunterliegendem System dem Coder überlassen.</p>
<p>Anfangs hatte ich den Datentyp der Offsets über ein Templateargument festgelegt, in etwa so:</p>
<pre><code class="language-cpp">template&lt;typename TOffsetType&gt;
class SomeHeader
{
    TOffsetType _offset;
};
</code></pre>
<p>Um es nun zumindest ein wenig einzuschänken, dass der Coder später einen Typ an das Template übergibt der kurzerhand ungleich 32/64 Bit lang ist, habe ich das ganze mit Type-Traits realisiert, funktioniert auch soweit wie gewünscht.</p>
<p>Jetzt kam mir das alles am Ende allerdings recht &quot;aufegbläht&quot; und unhandlich vor, und da ist mir die Idee gekommen das so kurzerhand so zu implementieren:</p>
<pre><code class="language-cpp">class SomeHeader
{
    bool is64;

    union
    {
        uint8_t raw[8];
        uint32_t l32;
        uint64_t l64;
    }_offset;
};
</code></pre>
<p>Mal ganz unabhängig davon, dass es bei verschiedenen Systemen ein Endianness Problem geben kann (darum kümmere ich mich beim Schreiben/Lesen in und aus dem File), ist das eine akzeptable Lösung (oder gar eine bescheuerte) und gibt es da eventuell Probleme im Sinne der Portabilität?</p>
<p>Falls jemand einen noch ganz anderen Ansatz hat, immer her damit.</p>
<p>Danke für etwaige Antworten!</p>
<p>Gruß<br />
PuerNoctis</p>
<p>EDIT: Ups, kleine Anpassung im Code</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/285770/kurze-frage-zu-unions</link><generator>RSS for Node</generator><lastBuildDate>Fri, 21 Aug 2026 05:13:50 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/285770.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 27 Apr 2011 15:20:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Kurze Frage zu Unions on Wed, 27 Apr 2011 15:34:55 GMT]]></title><description><![CDATA[<p>Hey Community,</p>
<p>wie der Titel bereits sagt, habe ich eine kurze Frage zu Unions. Ich habe DERMAßEN wenig mit Unions bisher gerabeitet, ich bin mir echt nicht 100% sicher. Kurz zu meinem Problem:</p>
<p>Ich habe eine Klasse die einen &quot;Header&quot; repräsentiert, von dem später einige Informationen in ein File geschrieben werden. Darunter sind Offsets in dem File die wahlweise in 32 oder 64 Bit Länge (uint32_t / uint64_t) geschrieben werden. Welche Länge es am Ende ist bleibt unabhängig vom darunterliegendem System dem Coder überlassen.</p>
<p>Anfangs hatte ich den Datentyp der Offsets über ein Templateargument festgelegt, in etwa so:</p>
<pre><code class="language-cpp">template&lt;typename TOffsetType&gt;
class SomeHeader
{
    TOffsetType _offset;
};
</code></pre>
<p>Um es nun zumindest ein wenig einzuschänken, dass der Coder später einen Typ an das Template übergibt der kurzerhand ungleich 32/64 Bit lang ist, habe ich das ganze mit Type-Traits realisiert, funktioniert auch soweit wie gewünscht.</p>
<p>Jetzt kam mir das alles am Ende allerdings recht &quot;aufegbläht&quot; und unhandlich vor, und da ist mir die Idee gekommen das so kurzerhand so zu implementieren:</p>
<pre><code class="language-cpp">class SomeHeader
{
    bool is64;

    union
    {
        uint8_t raw[8];
        uint32_t l32;
        uint64_t l64;
    }_offset;
};
</code></pre>
<p>Mal ganz unabhängig davon, dass es bei verschiedenen Systemen ein Endianness Problem geben kann (darum kümmere ich mich beim Schreiben/Lesen in und aus dem File), ist das eine akzeptable Lösung (oder gar eine bescheuerte) und gibt es da eventuell Probleme im Sinne der Portabilität?</p>
<p>Falls jemand einen noch ganz anderen Ansatz hat, immer her damit.</p>
<p>Danke für etwaige Antworten!</p>
<p>Gruß<br />
PuerNoctis</p>
<p>EDIT: Ups, kleine Anpassung im Code</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2055162</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2055162</guid><dc:creator><![CDATA[PuerNoctis]]></dc:creator><pubDate>Wed, 27 Apr 2011 15:34:55 GMT</pubDate></item><item><title><![CDATA[Reply to Kurze Frage zu Unions on Thu, 28 Apr 2011 07:12:23 GMT]]></title><description><![CDATA[<p>Ich würde auf unions verzichten, weil das ganze ziemlich unsicher ist.</p>
<p>Du verhinderst hiermit nicht, dass du l32 schreibst aber auf l64 zugreifst, weil du dies nicht überprüfen kannst.</p>
<p>Ich würde Templates nutzen und default implementation bereitstellen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2055407</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2055407</guid><dc:creator><![CDATA[Seikilos]]></dc:creator><pubDate>Thu, 28 Apr 2011 07:12:23 GMT</pubDate></item><item><title><![CDATA[Reply to Kurze Frage zu Unions on Thu, 28 Apr 2011 10:00:15 GMT]]></title><description><![CDATA[<p>Laut standard sind nur die &quot;gemeinsam&quot; verwendeten bytes definiert!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2055479</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2055479</guid><dc:creator><![CDATA[muli]]></dc:creator><pubDate>Thu, 28 Apr 2011 10:00:15 GMT</pubDate></item><item><title><![CDATA[Reply to Kurze Frage zu Unions on Thu, 28 Apr 2011 10:08:50 GMT]]></title><description><![CDATA[<p>Hmhmhm... ja, das ist mir glaube ich echt etwas zu heikel. Ich werde das denke ich, wie Seikilos bereits vorgeschlagen hat, weiterhin mit meinen Templates und TypeTraits machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2055482</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2055482</guid><dc:creator><![CDATA[PuerNoctis]]></dc:creator><pubDate>Thu, 28 Apr 2011 10:08:50 GMT</pubDate></item></channel></rss>