2015-11-11 6 views
8

Cでは、スタック上のオーバーアライメント(つまり、タイプシステムから推測できるより多くのアラインメント)ストレージを取得する方法はありますか?Cのstd :: aligned_storage <>に相当しますか?

動的に割り当てられたメモリ内の変数については、他のすべてが失敗した場合でも手動で調整できますが、自動的に割り当てられたメモリの変数に対して何ができるのでしょうか?

私はそれがchar[size + alignment - 1]を使用して、常に変数にアクセスするには、ビット操作を使用しますが、これは必要以上に「ビット」shadier思えることも可能だと思う;)(HAR HAR HAR)。

+0

_Alignas指定を試しましたか? – this

+0

@このようなおっと、私は言及すべきであった、いいえC11、ありがとう – Praxeolitic

+0

なぜC11がオプションでなかったら他の答えを受け入れたのですか? :-( – this

答えて

5

はC2011で、_Alignas_Alignofキーワードがあり、それらの使用はわずかに少ない醜いなるヘッダ<stdalign.h>、及び(<stddef.h>である)タイプmax_align_t。あなたは、例えば、CPU固有ベクトル命令で使用するために必要であるかもしれないように、doubleための通常のアラインメントを4倍に位置合わせ16のdouble量の配列を要求する

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

を書き込むことができます。これはすべての実装で動作することは保証されていませんが、動作しない場合はコンパイル時エラーであることが保証されます。

C2011より前には、標準の方法がありませんでしたが、多くのコンパイラは、同様の機能を持つ拡張子を持っていました。 GCCの__attribute__ (aligned)構築物。

5

よく組合が思い浮かぶ。

union This 
{ 
    int integer; 
    align_type alignment; 
} ; 

組合内のメンバーの前にパディングはありません。したがって、自動変数union Thisを宣言すると、そのメンバーとそのメンバーのすべてが、最も高いアライメントを持つメンバーのアライメントと同じにアライメントされる必要があります。

関連する問題