Gibt es einen Weg (Merkmal oder so) zu erkennen, ob struct/class etwas Padding hat?Erkennen, ob die Struktur padding hat
Ich brauche keine plattformübergreifende oder standardisierte Lösung, ich brauche es für MSVC2013.
Ich kann es überprüfen, wie
namespace A
{
struct Foo
{
int a;
bool b;
};
}
#pragma pack(push, 1)
namespace B
{
struct Foo
{
int a;
bool b;
};
}
#pragma pack(pop)
static const bool has_padding = sizeof(A::Foo) != sizeof(B::Foo);
Aber C++ erlaubt es nicht (soweit ich weiß) erzeugen diese nicht-invasive (ohne bestehende Strukturen zu berühren)
Im Idealfall würde Ich mag bekommen Arbeit so etwas wie dieses
template <typename T>
struct has_padding_impl
{
typedef __declspec(align(1)) struct T AllignedT;
};
template <typename T>
struct has_padding : typename std::conditional<sizeof(typename has_padding_impl<T>::AllignedT) == sizeof(T),
std::false_type,
std::true_type>::type{};
EDIT - Warum das ich benötige?
Ich bin mit vorhandenen Serialisierung System arbeiten, die nur einige struct speichern void*
ihnen (innen generische Funktion) und speichern sizeof(T)
Anzahl von Bytes ... Solche Binärdatei nehmen ist nicht tragbar auf Plattformen wir zielen, da Verschiedene Compiler werden verwendet, daher gibt es keine Garantie, wie das Padding eingefügt wird. Wenn ich alle T
statisch erkennen könnte, die Strukturen mit Auffüllung sind, kann ich den Benutzer zwingen, Padding manuell einzufügen (einige Steuerauffüllung, nicht nur zufälliger Müll), so dass es kein "zufälliges" Auffüllen gibt. Ein weiterer Vorteil ist, wenn ich zwei Dateien von demselben Szenario vergleiche, werden sie gleich aussehen.
bearbeiten 2 je mehr ich darüber nachdenke, erkennen, je mehr ich mich Cross-Plattform-Lösung benötigen. Wir entwickeln hauptsächlich auf msvc2013, aber unsere Anwendung wird in msvc2012 und clang erstellt. Aber wenn ich alle compiler-generierten Auffüllen in msvc2013 entdeckt und loswird, gibt es keine Garantie, dass andere Compiler keine Auffüllung einfügen ... (so msvc2013 Erkennung ist nicht genug)
Warum denken Sie, dass Sie das brauchen? –
Padding verhält sich ähnlich wie ein unbenanntes Mitglied. Da Sie keine Mitglieder aufzählen können, ist es unmöglich, zwischen normalen Mitgliedern und solchen "unbenannten Mitgliedern" zu unterscheiden, die als Auffüllen dienen. – MSalters
Sie wissen, dass Sie mit der Option "Struct Member Alignment" auf der Codegenerierungs-Konfigurationsseite das MSVC-Auffüllverhalten angeben können, richtig? –