C++ 11 ha introdotto lo alignas
specifier per specificare l'allineamento di una variabile e lo alignof
operator per richiedere l'allineamento predefinito di un tipo. Tuttavia, non vedo alcun modo per ottenere l'allineamento di una variabile specifica. Prendiamo il seguente esempio banale:Interroga l'allineamento di una variabile specifica
alignas(16) float* array;
Ecco cosa possiamo fare a questo proposito:
alignof(float*)
rendimenti 8, che ovviamente non è quello che vogliamo.alignof(array)
restituisce 16, che è esattamente ciò che vogliamo, ma questa è un'estensione del compilatore;alignof
come specificato dallo standard non può essere utilizzato su una variabile specifica.alignof(decltype(array))
restituisce 8, il che era abbastanza prevedibile ma non quello che vogliamo.std::alignment_of
è implementato in termini dialignof
, quindi non aiuta molto.
Desidero un meccanismo per confermare che la variabile specifica array
sia allineata su un limite di 16 byte. C'è qualcosa nello standard per eseguire tale query?
* alignof * non deve fornire questo - restituisce un contratto minimo a * tempo di compilazione * - Si desidera un valore * in fase di esecuzione *. Una variabile specifica potrebbe benissimo essere * allineata al limite di una pagina *, ai confini dei megabyte o qualsiasi altra cosa in fase di esecuzione (cioè molto meglio di quanto promesso o richiesto). Prendi l'indirizzo della variabile e controlla che sia divisibile in base al valore di allineamento desiderato in modo uniforme. – tofro
@tofro Giusto, ho dimenticato di specificarlo, ma mi aspettavo un po 'di "allineamento" per trasformarlo in un oggetto di runtime quando usato su un nome di variabile (immagino che sia ciò che fa l'estensione del compilatore). Non mi aspettavo che tutto fosse conosciuto in fase di compilazione. – Morwenn
Non riesco a vedere se qualcosa come * # definisce ALIGNED8 (x) ((& (x) && 0x7) == 0) * non si adatta al tuo scopo o perché lo standard dovrebbe avere qualcosa che duplica questo semplice costrutto. – tofro