問題タブ [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.

0 投票する
4 に答える
17663 参照

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によって掘り出されたように。ただし、上記のテストでこれが何を意味するかを知るには、私は十分な専門家ではありません。

usingclang が私の属性を受け入れるという事実が何かを意味する場合、 の代わりにディレクティブを使用しようとするとtypedef、clang も文句を言うことに言及する価値があるかもしれません。また、この質問の以前のバージョンのステートメントとは対照的に、gcc は警告するだけでなく、実際にアライメントに対する私の希望を無視します。

0 投票する
1 に答える
918 参照

c++ - テンプレート関数で alignas(T) が解決されない

MinGW(version:4.8.1) で Eclipse を使用して次のコード フラグメントをコンパイルすると、パスはできますが、Eclipse は「この行に複数のマーカー - タイプ 'alignas' を解決できませんでした」と報告します。

コードフラグメントはコンパイルを通過しますが、Eclipseはエラーでマークしますが、この問題で何が起こりましたか。誰かがこの問題に遭遇したことがありますか? この問題を解決するために私を助けてください、本当にありがとう!

0 投票する
3 に答える
5214 参照

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) が行うことと同じではありません!

0 投票する
1 に答える
131 参照

c++ - "natural_alignment_of" type_trait?

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

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

背景:

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

憶測:

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

0 投票する
1 に答える
1583 参照

c++ - alignas 構文との闘い

クラスメンバーであるポインターに使用しようとしてalignasいますが、率直に言って、どこに置くべきかわかりません。

例えば:

これにより、ptr のデータが 64 バイト ブロックに配置されることが保証されました。Intelコンパイラを使用すると、そうではありません。

誰かが私を正しい方向に向けることができますか?

0 投票する
1 に答える
1220 参照

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 のみを使用して、プリプロセッサなしでそれを行う方法はありますか?

0 投票する
1 に答える
806 参照

c++ - 32 ビット プラットフォームの構造体の alignas

32 ビット x86 Linux で次のコードを実行すると、予期しない結果が発生します (コンパイラ フラグ: g++ -std=c++14 -m32)。gccとclangを試しました。

出力は次のとおりです。

ここで何が起きてるの?S1 と S2 のサイズが異なるのはなぜですか? 私が理解しているように、64 ビットの整数値は、32 ビットの x86 マシンでは 32 ビットに揃えられています。これは、S1 のサイズが 12 バイトである理由を説明しています。しかし、なぜこれが S2 に当てはまらないのでしょうか?

0 投票する
2 に答える
1506 参照

c++ - alignas キーワードが尊重されない

キャッシュ境界で型をオーバーアラインしたいので、次を使用しましたalignas

これはうまくコンパイルされます。しかし、驚いたことに、一連の s を割り当てようとするとW、それらは 64 バイトでアラインされていませんが、実際には 16 バイトでアラインされています。

収量:

いくつかのコンパイル (gcc 4.8.2、gcc 5.2.0、clang 3.7.1) で。調子はどう?整列するように言ったのに、なぜ整列しないのですか?

0 投票する
1 に答える
163 参照

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 内で動的に割り当てられた配列を使用すると、正しく動作します。

私はアライナスについて何か誤解していますか?