Ermittelt, ob die Struktur eine Auffüllung hat

9

Gibt es einen Weg (Eigenschaft oder so) zu erkennen, ob struct / class etwas Padding hat?

Ich brauche keine plattformübergreifende oder standardisierte Lösung, ich brauche es für MSVC2013.

Ich kann es überprüfen wie

%Vor%

Aber C ++ erlaubt nicht (soweit ich weiß), dies nicht-invasiv zu erzeugen (ohne bestehende Strukturen zu berühren)

Idealerweise würde ich gerne so etwas arbeiten

%Vor%

BEARBEITEN - Warum brauche ich das?

Ich arbeite mit existierenden Serialisierungssystemen, die einige Strukturen speichern, indem sie void* auf sie nehmen (innerhalb der generischen Funktion) und speichern sizeof(T) Anzahl der Bytes ... Eine solche Binärdatei ist auf Plattformen, auf die wir zielen, nicht portierbar Da verschiedene Compiler verwendet werden, gibt es keine Garantie wie Padding eingefügt wird. Wenn ich alle T , die Strukturen mit Padding sind, statisch erkennen könnte, kann ich den Benutzer zwingen, Padding manuell einzufügen (etwas Control-Padding, nicht nur Zufallsmüll), so dass es kein "zufälliges" Padding gibt. Ein weiterer Vorteil ist, wenn ich zwei Speicherdateien desselben Szeneris vergleiche, werden sie gleich aussehen.

2 bearbeiten Je mehr ich darüber nachdenke, desto mehr erkenne ich, dass ich eine plattformübergreifende Lösung brauche. Wir entwickeln hauptsächlich auf msvc2013, aber unsere Anwendung wird in msvc2012 und clang erstellt. Aber wenn ich alle Compiler-generierte Auffüllung in msvc2013 entdeckt und loswird, gibt es keine Garantie, dass andere Compiler keine Auffüllung einfügen ... (so msvc2013 Erkennung ist nicht genug)

    
relaxxx 14.08.2015, 09:50
quelle

3 Antworten

2

Benötigen Sie diese Informationen während der Laufzeit? Denn wenn Sie es in der Build-Zeit wissen wollen, können Sie verwenden static_assert , um diese Informationen zu erhalten.

%Vor%

Wenn Sie es während der Laufzeit benötigen, können Sie Folgendes versuchen:

%Vor%

Überprüfen Sie auch diesen Link von einem früheren Post Vielleicht hilft es.

    
Alex Lop. 14.08.2015 10:26
quelle
0

Probieren Sie dieses Makro aus:

%Vor%

Und jetzt zur Laufzeit können Sie testen:

%Vor%

Und offc, Sie können static_assert verwenden, wenn Sie bei der Kompilierung einen Fehler erhalten möchten.

    
MichaelCMS 14.08.2015 11:54
quelle
-1

Vielleicht sollten Sie so etwas ausprobieren:

%Vor%

Ich habe:

%Vor%

Ich bin auf Ubuntu 14.04.

    
Richard Rublev 14.08.2015 10:06
quelle

Tags und Links