2015-11-11 11 views
8

In C, c'è un modo per ottenere un allineamento troppo allineato (cioè più allineamento di quello che si può dedurre dal sistema di tipi) nello stack?Equivalente di std :: aligned_storage <> in C?

Per le variabili nella memoria allocata dinamicamente, è sempre possibile eseguire l'allineamento manuale se tutto il resto fallisce, ma cosa può essere fatto per le variabili nella memoria allocata automaticamente?

Suppongo che sia possibile utilizzare uno char[size + alignment - 1] e quindi utilizzare sempre la manipolazione dei bit per accedere alla variabile ma questo sembra un "bit" più ombreggiato del necessario (har har har;)).

+0

Hai provato l'identificatore di _Alignas? – this

+0

@this oops, avrei dovuto dire, senza C11, grazie – Praxeolitic

+0

Perché hai accettato l'altra risposta se C11 non era un'opzione? :-( – this

risposta

5

In C2011, vi sono le _Alignas e _Alignof parole chiave, l'intestazione <stdalign.h> che rende il loro uso leggermente meno brutto, e il tipo max_align_t (che è in <stddef.h>). È possibile, ad esempio, scrivere

double _Alignas(4*_Alignof(double)) dvector[16]; 

per richiedere una serie di 16 double quantità allineati a 4 volte il consueto allineamento per double, come potrebbe essere necessario per l'uso con le istruzioni vettoriali specifici della CPU. Non è garantito che funzioni su tutte le implementazioni, ma se non funziona è garantito che si tratti di un errore in fase di compilazione.

Prima del C2011 non esisteva lo standard, ma molti compilatori avevano estensioni con funzionalità simili, ad es. Costrutto di GCC __attribute__ (aligned).

5

I sindacati mi vengono in mente.

union This 
{ 
    int integer; 
    align_type alignment; 
} ; 

Non c'è riempimento prima dei membri nei sindacati. Quindi se dichiari una variabile automatica union This, allora essa, e tutti i suoi membri, dovrebbero essere allineati come l'allineamento del membro con l'allineamento più alto.

Problemi correlati