C'è un modo (tratto o così) da rilevare, se struct/class ha qualche padding?Rileva se struct ha padding
Non ho bisogno di una soluzione multipiattaforma o standardizzata, ne ho bisogno per MSVC2013.
posso controllare come
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);
Ma C++ non permette (per quanto ne so) generare questo non invasivo (senza toccare le strutture esistenti)
Idealmente mi piacerebbe ottenere qualcosa di lavorare in questo modo
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 - Perché ho bisogno di questo?
I'am lavorando con sistema esistente serializzazione, che immagazzinano alcuni struct solo prendendo void*
a loro (all'interno funzione generica) e memorizzare sizeof(T)
numero di byte ... Tale file binario non è portabile su piattaforme sulle quali puntiamo, dal momento che vengono utilizzati diversi compilatori, quindi non vi è alcuna garanzia su come viene inserito il padding. Se potessi rilevare staticamente tutte le T
che sono strutture con padding, posso forzare l'utente a inserire manualmente il padding (un po 'di controllo padding, ad esempio non solo una spazzatura casuale), quindi non c'è padding "casuale". Un altro inconveniente è che, quando differisco due file di salvataggio dello stesso scenerio, avranno lo stesso aspetto.
modifica 2 più ci penso, più mi rendo conto di aver bisogno di una soluzione multipiattaforma. Sviluppiamo principalmente su msvc2013 ma la nostra applicazione è in fase di costruzione finale in msvc2012 e clang. Ma se ho rilevato e rimosso tutti i padding generati dal compilatore in msvc2013, non c'è alcuna garanzia che l'altro compilatore non inserisca padding ... (quindi il rilevamento msvc2013 non è sufficiente)
Perché pensi di aver bisogno di questo? –
Il riempimento si comporta come un membro senza nome. Poiché non puoi enumerare membri, è impossibile distinguere tra membri normali e quei "membri senza nome" che fungono da padding. – MSalters
Sapete che è possibile specificare il comportamento del riempimento MSVC utilizzando l'opzione "Allineamento membri di Struct" nella pagina di configurazione Generazione codice, giusto? –