0

C++11 ではalignas、新しい型を定義するために使用できるキーワードがあります。これは単に既存の型ですが、より厳密なアラインメント (typedef など) を使用します。

typedef char Maximally_Aligned_Char alignas( max_align_t );

typename Tを指定して、型の元の「自然な」アラインメントをプログラムで決定する方法はありますか? コンパイルされる次の概念的なnatural_alignment_oftype_trait のようなもの:

size_t natural_char_alignment = natural_alignment_of< Maximally_Aligned_Char >::value;
static_assert( natural_char_alignment == alignof( char ) );

背景:

すべてのスカラー型に作用するテンプレート化されたコードを書いています。一般に、整数の場合( sizeof( T ) == alignof( T ) )は正しいですが、公式のalignasサポートにより、この仮定をもう行うことはできないと思います.

憶測:

おそらく何かstd::decayがうまくいくでしょうか?コードをテストすると、G++4.8 が「テンプレート引数の属性を無視する」ことについて警告していることがわかりました。

4

1 に答える 1

1

natural_alignment正直なところ、あなたが自分の特性で何ができるのか理解できません。

アラインメントが 16 の型定義すると、この型のすべてのインスタンスのアラインメントが 16 になることが期待されます。この契約を破ることはできません。

についてはすでに知っているのでalignof、単純に使用してみませんか? 理論的には 2 の累乗でないアラインメントを使用することも考えられますが、実際には非常に脆いstd::max(sizeof(T), alignof(T))ため、計算の基礎として使用するだけで済みます。

注: データの圧縮率が低くなり、パディングが導入されたことを意味する場合がありますが、なぜ気にする必要があるのでしょうか? ユーザーの制約の中でベストを尽くしました。

于 2013-12-06T18:54:37.403 に答える