C ++メモリの整列問題

理論的には、32ビットシステムでは、intは4バイトを占有し、charは1バイトを占有するため、それらを構造体に配置すると、4 + 1 = 5バイトになるはずですが、実際には、プログラムを実行して得られる結果は8バイトです。メモリアラインメントが原因です。次のようにコードを見てください。

#include<stdio.h>
struct{
    int x;
    char y;
}s;

int main()
{
    printf("%d\n",sizeof(s);  // 输出8
    return 0;
}

現代のコンピュータのメモリ空間はバイトで分割されています。理論的には、任意のタイプの変数へのアクセスは任意のアドレスから開始できるようですが、実際のコンピュータシステムでは、メモリに格納される基本タイプのデータの場所に制限があります。これらのデータの最初のアドレスの値は、特定の数kの倍数である必要があります(通常は4または8です)。これは、メモリアライメントと呼ばれます

特定のプラットフォーム上の各コンパイラには、独自のデフォルトの「整列係数」(整列係数とも呼ばれます)があります。gccのデフォルトの#pragma pack(4)は、プリコンパイルされたコマンド#pragma pack(n)、n = 1,2,4,8,16で変更できます。
その値に有効です。これは、指定された値#pragma pack(n)と構造体で最も長いデータ型の長さのどちらか小さい方です。有効な整列値は整列単位とも呼ばれます

個人的な理解図
ここに画像の説明を挿入
の3つの図は、それぞれ次のコードのX1、X2、X3構造のメモリマップを表しています。

#include<stdio.h>
struct
{
    int i;    
    char c1;  
    char c2;  
}x1;

struct{
    char c1;  
    int i;    
    char c2;  
}x2;

struct{
    char c1;  
    char c2; 
    int i;    
}x3;

int main()
{
    printf("%d\n",sizeof(x1));  // 输出8
    printf("%d\n",sizeof(x2));  // 输出12
    printf("%d\n",sizeof(x3));  // 输出8
    return 0;
}

たとえば、X1とiのメモリは4であり、これはアライメントユニット4を占有するため、次のC1、C2は次の4ユニットの長さを入力し、C1 + C2のメモリ長は4未満なので、X1構造体の長さは8です。 、そしてX2では、最初の要素C1のメモリ長は1、2番目の要素の長さは4、4 + 1 = 5であり、これは整列単位を超えているため、2番目のメモリ単位を配置し、3番目の要素を配置します次のメモリユニットに移動すると、構造全体の長さが8になり
ます。この記事を参照してください。リンクはWeChatの記事です。

リリース9件のオリジナルの記事 ウォンの賞賛0 ビュー253

おすすめ

転載: blog.csdn.net/a_465240/article/details/104584289
おすすめ