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 の最小アライメント値はあるのでしょうか?
以下は私のテストコードです:
#include <iostream>
#include <cstddef>
using namespace std;
#pragma pack(1)
struct STestPragmaPack {
char c;
long d;
} datasPP;
#pragma pack()
struct STestAttributPacked {
char c;
long d;
} __attribute__((packed)) datasAP;
struct STestAlignas {
char c;
alignas(char) long d;
} datasA;
int main() {
cout << "pragma pack = " << sizeof(datasPP) << endl;
cout << "attribute packed = " << sizeof(datasAP) << endl;
cout << "alignas = " << sizeof(datasA) << endl;
}
gcc 4.8.1 の結果:
pragma pack = 5
attribute packed = 5
alignas = 8
[26.08.2019]
このトピックには標準化の動きがあるようです。p1112 提案 -クラス レイアウト制御の言語サポート- (とりわけ)[[layout(smallest)]]
アラインメント コストをできるだけ小さくするためにクラス メンバーを並べ替える属性を追加することを提案します (これはプログラマーの間で一般的な手法ですが、クラス定義の読みやすさを損なうことがよくあります)。 . しかし、これはpragma(pack) が行うことと同じではありません!