C ++メモリアライメントルール

メモリアライメントの3つのルール:

  1. 構造体の各メンバーについて、最初のメンバーのオフセットは0であり、後続のメンバーの現在のオフセットは、現在のメンバータイプの整数倍である必要があります。
  2. 構造内のすべてのデータメンバーがそれぞれのメモリで整列された後、構造全体が占めるメモリが構造内の最大のデータメンバーの最小の整数倍になるように、構造自体を1回整列する必要があります。
  3. プログラムに#pragmapack(n)プリコンパイル済み命令がある場合、すべてのメンバーの配置はnバイト(つまり、オフセットはnの整数倍)、および現在のタイプと最大のタイプに基づいています。構造体は考慮されなくなりました
#include<iostream>
using namespace std;
struct A{
    char a;
    int b;
    short c;
};

struct B{
    short c;
    char a;
    int b;
};
int main(){
    cout<<sizeof(A)<<endl;
    cout<<sizeof(B)<<endl;
    return 0;
}

 

上記の構造体Aを例として取り上げます。最初のメンバーaはchar型で、オフセット0で1バイトのスペースを占有します。2番目のメンバーbはint型で、4バイトのスペースを占有します。ルール1によると、 bのオフセットはint型の整数倍でなければならないため、コンパイラは変数の後に3バイトのバッファを挿入して、bのオフセット(4バイト)がb型の整数倍(現在はIs)であることを確認します。 1回)、3番目のメンバーcはshort型です。この時点で、cのオフセットは正確に4 + 4 = 8バイトであり、これはすでにshort型の整数倍であるため、間にバッファワードを入力する必要はありません。 bおよびcセクション。ただし、現時点では、構造体Aのサイズは8 + 2 = 10バイトです。ルール2によると、構造体Aのサイズは最大のメンバー型intの整数倍である必要があるため、10バイトに基づいて2を入力します。ルール2に準拠するために、最終的な構造サイズが12であることを確認するためのバイト。

 

おすすめ

転載: blog.csdn.net/m0_37981386/article/details/108329262