問題タブ [alignas]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++11 のどこで alignas() を使用できますか?
コードを標準化し、移植性を高めるために、次のように置き換えました。
と
C++11 で。しかし、gnu (4.8) はそれを好まず、不平を言っています。
一方、clang 3.2 は警告を生成しません (たとえ があっても-Weverything -Wno-c++98-compat -pedantic
)。したがって、上記のコードが正しいかどうか、より一般的には、配置できる場所alignas()
と配置できない場所があるのではないかと思います。
編集(2013年4月):
標準の関連記事は 7.6.2、特に 7.6.2.1 です。
アライメント指定子は、変数またはクラス データ メンバーに適用できますが、ビット フィールド、関数パラメーター、catch 句の仮パラメーター (15.3)、または で宣言された変数には適用してはなりません。ストレージ クラス指定子を登録します。アライメント指定子は、クラスまたは列挙型の宣言にも適用できます。省略記号付きの配置指定子は、パック展開 (14.5.3) です。
すでにレッドXIIIによって掘り出されたように。ただし、上記のテストでこれが何を意味するかを知るには、私は十分な専門家ではありません。
using
clang が私の属性を受け入れるという事実が何かを意味する場合、 の代わりにディレクティブを使用しようとするとtypedef
、clang も文句を言うことに言及する価値があるかもしれません。また、この質問の以前のバージョンのステートメントとは対照的に、gcc は警告するだけでなく、実際にアライメントに対する私の希望を無視します。
c++ - テンプレート関数で alignas(T) が解決されない
MinGW(version:4.8.1) で Eclipse を使用して次のコード フラグメントをコンパイルすると、パスはできますが、Eclipse は「この行に複数のマーカー - タイプ 'alignas' を解決できませんでした」と報告します。
コードフラグメントはコンパイルを通過しますが、Eclipseはエラーでマークしますが、この問題で何が起こりましたか。誰かがこの問題に遭遇したことがありますか? この問題を解決するために私を助けてください、本当にありがとう!
c++ - alignas を使用してプラグマ パックを置き換えるには?
alignas の使用方法を理解しようとしています。プラグマ パックの代わりになるのではないかと思います。検証しようと努力しましたが、うまくいきませんでした。gcc 4.8.1 ( http://ideone.com/04mxpI ) を使用すると、STestAlignas の下で常に 8 バイトを取得しますが、プラグマ パックでは 5 バイトです。私が達成したいのは、sizeof(STestAlignas) が 5 を返すようにすることです。clang 3.3 ( http://gcc.godbolt.org/ ) でこのコードを実行しようとしましたが、エラーが発生しました:
!!エラー: 要求されたアラインメントは、タイプ 'long' の最小アラインメント 8 未満です - alignas の使用法のすぐ下です。
では、alignas の最小アライメント値はあるのでしょうか?
以下は私のテストコードです:
gcc 4.8.1 の結果:
[26.08.2019]
このトピックには標準化の動きがあるようです。p1112 提案 -クラス レイアウト制御の言語サポート- (とりわけ)[[layout(smallest)]]
アラインメント コストをできるだけ小さくするためにクラス メンバーを並べ替える属性を追加することを提案します (これはプログラマーの間で一般的な手法ですが、クラス定義の読みやすさを損なうことがよくあります)。 . しかし、これはpragma(pack) が行うことと同じではありません!
c++ - "natural_alignment_of" type_trait?
C++11 ではalignas
、新しい型を定義するために使用できるキーワードがあります。これは単に既存の型ですが、より厳密なアラインメント (typedef など) を使用します。
typename T
を指定して、型の元の「自然な」アラインメントをプログラムで決定する方法はありますか? コンパイルされる次の概念的なnatural_alignment_of
type_trait のようなもの:
背景:
すべてのスカラー型に作用するテンプレート化されたコードを書いています。一般に、整数の場合( sizeof( T ) == alignof( T ) )
は正しいですが、公式のalignas
サポートにより、この仮定をもう行うことはできないと思います.
憶測:
おそらく何かstd::decay
がうまくいくでしょうか?コードをテストすると、G++4.8 が「テンプレート引数の属性を無視する」ことについて警告していることがわかりました。
c++ - alignas 構文との闘い
クラスメンバーであるポインターに使用しようとしてalignas
いますが、率直に言って、どこに置くべきかわかりません。
例えば:
これにより、ptr のデータが 64 バイト ブロックに配置されることが保証されました。Intelコンパイラを使用すると、そうではありません。
誰かが私を正しい方向に向けることができますか?
c++ - alignas を使用して構造体を整列させます
次の構造体では:
正確に6バイトになるalignas
ように使用する方法は?sizeof(test)
alignas(1)
はコンパイラ (gcc、msvc、clang) によって受け入れられません (次のようなエラー: error: requested alignment is less than minimum alignment of 4 for type 'test'
)。
アップデート。もちろん、このバリアントは問題なく動作します。
しかし、標準の C++11/14 のみを使用して、プリプロセッサなしでそれを行う方法はありますか?
c++ - 32 ビット プラットフォームの構造体の alignas
32 ビット x86 Linux で次のコードを実行すると、予期しない結果が発生します (コンパイラ フラグ: g++ -std=c++14 -m32)。gccとclangを試しました。
出力は次のとおりです。
ここで何が起きてるの?S1 と S2 のサイズが異なるのはなぜですか? 私が理解しているように、64 ビットの整数値は、32 ビットの x86 マシンでは 32 ビットに揃えられています。これは、S1 のサイズが 12 バイトである理由を説明しています。しかし、なぜこれが S2 に当てはまらないのでしょうか?
c++ - alignas キーワードが尊重されない
キャッシュ境界で型をオーバーアラインしたいので、次を使用しましたalignas
。
これはうまくコンパイルされます。しかし、驚いたことに、一連の s を割り当てようとするとW
、それらは 64 バイトでアラインされていませんが、実際には 16 バイトでアラインされています。
収量:
いくつかのコンパイル (gcc 4.8.2、gcc 5.2.0、clang 3.7.1) で。調子はどう?整列するように言ったのに、なぜ整列しないのですか?
c++ - オブジェクトへのメンバー ポインターに関する gcc alignas の問題
私は gcc 4.9.2 を使用しており、AVX で使用するために静的に初期化された配列を適切に整列させようとしています。アラインメントの問題により segfault が発生するコードの要点は次のとおりです。
私のシステムでは、配列 a.b2->x が 32 バイト境界に整列していません。x が配列である限り、x のサイズは問題ではありません (つまり、"double x = 0" は問題なく動作します)。代わりに B の静的に割り当てられたメンバーへのポインターを作成すると、正しく機能します。main 内にローカル変数 *b1 と *b2 を作成すると、正常に動作します。クラス A と posix_memalign 内で動的に割り当てられた配列を使用すると、正しく動作します。
私はアライナスについて何か誤解していますか?