Diciamo che ho questo tipo:Come fare una affermazione statica che un cast puntatore è banale?
struct A {
int a;
};
struct B {
int b;
};
struct C : public A, public B {
int c;
};
Un puntatore C*
può essere lanciato a A*
puntatore senza regolare l'indirizzo effettivo a tutti. Tuttavia, quando viene eseguito il cast dello C*
su B*
, il valore deve essere modificato. Mi piacerebbe assicurarmi che due tipi correlati che ho possano essere espressi l'uno con l'altro senza modificare l'indirizzo (cioè che non ci sia ereditarietà multipla o che la classe base sia la prima base della classe derivata). Questo potrebbe essere verificato in fase di esecuzione, ad es. in questo modo
assert(size_t(static_cast<A*>((C*)0xF000) == 0xF000);
assert(size_t(static_cast<B*>((C*)0xF000) != 0xF000);
che funziona. Ma questa informazione è nota al momento della compilazione, quindi sto cercando un modo per fare una dichiarazione in fase di compilazione su di esso. I modi ovvi conversione dell'anticipo di cui sopra per un assert statico (ad esempio sostituire assert
con BOOST_STATIC_ASSERT
dare l'errore "un getto di un tipo diverso da un tipo intero o di enumerazione non può apparire in una costante espressione" con g ++ 4.2.
Mobilità non è troppo importante Uso delle estensioni gcc, o trucchi modello hacky sarebbe tutto bene
Aggiornamento:.. trovato che quasi la stessa domanda è stato chiesto prima:. C++, statically detect base classes with differing addresses? Utilizzando offsetof()
è l'unico suggerimento utile anche lì.
Non voler essere un nitpick, ma dal momento che l'esatta configurazione della memoria è un dettaglio di implementazione ... perché ti interesserebbe esattamente? –
Sono abbastanza sicuro che le librerie Boost/lambda contengano cose per questo. Dovrei cercare, ma Alexandrescu e Vandervoorde hanno pubblicato quasi tutti i trucchi in questo campo – sehe
Sono davvero interessato alla domanda che @Matthieu M. presenta: In base a quale circostanza importa se un cast può essere banale? (cioè se non è banale, il costo è probabilmente trascurabile: aggiunta di una costante al puntatore derivato e se la condizione non viene eseguita correttamente si verificherà un vero dolore cercando di eseguire il debug di ciò che apparirà come memoria corrotta) –