2013-03-20 19 views
10

私は現在C++ 11でOSカーネルを開発中ですが、私は質問に出くわしました。答えは見つからないようです私自身。alignas指定子と__attribute __(整列)、C++ 11

現在、コンパイラ固有の属性(例:gccの__attribute__(aligned))を使用してページング構造を調整していますが、代わりにC++ 11のalignas指定子を使用したいと思います。これはClangには問題ありません。 alignasへのパラメータとして4096のアライメントを受け付けますが、G ++はアライメントしません!

まず最初に、alignas specifierとgcc __attribute__(aligned)の主な違いは明らかに特定の値とのアライメントが保証されていますが、gccのアライメント指定子には128の制限があるようですが、無限、なぜこれは?

なぜconst整数をアライン指定子に渡すことができないのですか?

+0

どのバージョン:

あなたの最後の質問に答えるために、alignasだけのために定義されて?ここでGCC 4.8を選んだら:http://liveworkspace.org/code/1hxHGg$0、それはうまく動作します。 –

+0

@ R.MartinhoFernandes:4.8; http://liveworkspace.org/code/1kRIjz$0を参照してください。エラーは '警告:要求されたアラインメント4096は128より大きい[-Wattributes]' – Skeen

+1

です。それは質問に入れるのに有益な情報のように思えます:) –

答えて

6

GCCのサポート状況から、gcc 4.7では完全にサポートされていないようですが、gcc 4.8です。 alignasも、4.8 release pageから新たにサポートされている機能としてリストされています。 alignment support proposal(3.11)よりも

、:基本的な位置合わせは以下alignofに等しいすべてのコンテキストで実装、(STDによってサポート最大アラインメントに等しい配向で表される

:: max_align_t)(18.1)。

拡張アラインメントは、 アラインメント(std :: max_align_t)より大きいアラインメントで表されます。拡張された アラインメントがサポートされているかどうか、およびそれらがサポートされているコンテキスト(7.1.6)がインプリメンテーションによって定義されます。拡張アライメント要件を有するタイプ は、オーバーアラインタイプである。

、同じ文書(7.1.6)から:

定数式は、拡張された位置合わせおよび実装 に評価された場合、宣言のコンテキストでプログラムをその位置合わせをサポートしていません奇形です

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

__attribute__(aligned)alignasの違いについては、私はそれらが意味的に異なるとは思わないが、一方はコンパイラ拡張であり、他方は標準で完全に定義されているということです。 GCCの

alignas (constant-expression) 
alignas (type-id) 
+0

私はそれが標準と他の1つはコンパイラの拡張機能ですが、なぜ同じ制限を持っていない、実装はapperently同じだろうか? - また、alignasの引数として、標準の整数をサポートしないという議論は何でしょうか? – Skeen

+0

実際にはgcc-4.8の定数整数でも動作するようです。現在の制限は、GCCの実装の問題にすぎないかもしれません。私は、たとえセマンティクスであっても、名前付き指定子とコンパイラ拡張の実装が同じであるとは思わない。それは単に一時的な制限かもしれません。 – Thibaut

+1

あなたはそうです、それは動作しているようです(それは '__attribute __((aligned(...))'で、定数を受け付けません)、コンパイラでは一時的なものか、 – Skeen

関連する問題