alignas は sizeof の値に影響しますか? 質問する

alignas は sizeof の値に影響しますか? 質問する
#include <iostream>
using namespace std;

int main()
{
    alignas(double) unsigned char c[1024];   // array of characters, suitably aligned for doubles
    alignas(16) char d[100];            // align on 16 byte boundary
    cout<<sizeof(c)<<endl;
    cout<<sizeof(d)<<endl;
    constexpr int n = alignof(int);     // ints are aligned on n byte boundarie
    cout<<n<<endl;
}

コードは次のとおりです。 の場合、 はで揃える必要があり、 はバイトであることalignas(double) unsigned char c[1024];を意味します。したがって、 は バイトであるべきだと思いますが、コンソール出力は です。cdoubledouble8sizeof(c)1024*81024

それで私は混乱しています。理由を教えていただける方はいらっしゃいますか?

ベストアンサー1

キーワードalignasを使用して、アライメント要件を指示できます。alignas(double)たとえば、変数に と同じアライメント要件を強制しますdouble。私のプラットフォームでは、これは変数が 8 バイト境界にアライメントされることを意味します。

この例では、配列全体がアライメント要件を満たすため、8 バイト境界に揃えられますが、サイズには影響しません。

alignasただし、アライメント要件を満たすために追加のパディングが必要な場合、複合データ型のサイズを変更することは可能です。次に例を示します。

#include <iostream>
#include <cstddef>

struct Test
{
    char a;
    alignas(double) char b;
};

int main(int argc, char* argv[])
{
    Test test;
    std::cout << "Size of Struct: " << sizeof(Test) << std::endl;
    std::cout << "Size of 'a': " << sizeof(test.a) << std::endl;
    std::cout << "Size of 'b': " << sizeof(test.b) << std::endl;
    std::cout << "Offset of 'a': " << (int)offsetof(struct Test, a) << std::endl;
    std::cout << "Offset of 'b': " << (int)offsetof(struct Test, b) << std::endl;
    return 0;
}

出力:

Size of Struct: 16
Size of 'a': 1
Size of 'b': 1
Offset of 'a': 0
Offset of 'b': 8

この構造体のサイズは、両方のメンバーがそれぞれ 1 バイトのサイズであるにもかかわらず、私のプラットフォームでは 16 バイトです。したがって、 はbアラインメント要件によって大きくなりませんでしたが、 の後に追加のパディングがありますa。これは、個々のメンバーのサイズとオフセットを見るとわかります。aはサイズが 1 バイトですがb、アラインメント要件により、 は 8 バイトのオフセットの後から始まります。

また、構造体のサイズは、そのアラインメントの倍数である必要があります。そうでない場合、配列は機能しません。したがって、構造体全体のサイズよりも大きいアラインメント要件を設定する場合 (たとえば、単一の short のみを含む構造体で、そのデータ メンバーに alignas(double) を適用する場合)、その後にパディングを追加する必要があります。

おすすめ記事