12

現在、C++11 で OS カーネルを開発中ですが、質問に出くわしました。自分で答えを見つけることができないようです。

現在、コンパイラ固有の属性 (gcc など__attribute__(aligned)) を使用してページング構造を調整していますが、代わりに C++ 11 alignas 指定子を使用したいと考えています。ただし、G++ はそうではありません。

alignas specifierまず第一に、 と gccの主な違いは何__attribute__(aligned)ですか?明らかにどちらも特定の値へのアライメントを保証しますが、gcc の alignas 指定子には 128 の制限があるようですが、属性はほとんど無制限に見えますが、これはなぜですか?

また、 const 整数を alignas 指定子に渡せないのはなぜですか?

4

2 に答える 2

7

GCC のサポート状況から、アラインメントのサポートはgcc 4.7では完全にはサポートされていないようですが、gcc 4.8ではサポートされています。は、4.8リリース ページalignasから新たにサポートされた機能としてもリストされています。

また、アライメントサポートの提案(3.11) から:

基本的なアラインメントは、すべてのコンテキストで実装によってサポートされる最大のアラインメント以下のアラインメントによって表されます。これは、alignof(std::max_align_t) (18.1) と同じです。

拡張アラインメントは、alignof(std::max_align_t) より大きいアラインメントによって表されます。拡張アラインメントがサポートされているかどうか、およびそれらがサポートされているコンテキスト (7.1.6) は実装定義です。拡張アラインメント要件を持つ型は、過剰にアラインされた型です。

そして、同じドキュメント (7.1.6) から:

定数式が拡張アラインメントに評価され、実装が宣言のコンテキストでそのアラインメントをサポートしていない場合、プログラムは整形式ではありません

それも答えの一部かもしれません。現時点では完全な標準にアクセスできません。誰かがこれを確認できるはずです。

__attribute__(aligned)との違いについては、alignas意味的に異なるとは思いませんが、一方は単なるコンパイラ拡張であり、もう一方は標準によって完全に定義されています。

最後の質問に答えるにalignasは、次に対してのみ定義されています。

alignas ( constant-expression ) 
alignas ( type-id ) 
于 2013-03-20T15:08:13.287 に答える
0

配置できる場所が異なります。attribute (aligned) は関数の戻り型として指定できますが、alignas は指定できません。意味的には同じです。

于 2020-12-17T17:23:14.897 に答える