C‐データ構造における構造パディング


この記事では、Cの構造パディングについて詳しく説明します.

目次:

  • Let’s recall some basics
  • Why structure padding?
  • Concept of padding
  • How it works?
  • More examples to understand better
  • How to avoid the structure padding in c?
  • 若干の基本を思い出しましょう


    メモリは、オブジェクトが宣言された後にのみ、構造体のメンバーに割り当てられます.一旦我々が宣言するならば、メモリのオブジェクト連続ブロックは構造メモリに割り当てられます.
    宣言された順番に割り当てられます.
    1.  struct student
    2.  {  
    3.     char a;  //1 byte
    4.     char b;  //1 byte
    5.     int c;  //4 byte
    6.  } stud1;
    

    構造パディングの理由


    例でわかりましょう.
    1.  struct student  
    2.  {  
    3.     char a;  //1 byte
    4.     char b;  //1 byte
    5.     int c;  //4 byte
    6.  } stud1;  
    
    通常、構造体のサイズを計算するために、構造体に存在するすべてのデータメンバーのサイズを追加します.
    したがって、すべてのデータ型の上記のサイズを考慮すると、構造オブジェクトのサイズは一般的なルールに対して6バイトのACCである.
    しかし、この答えは間違っています.さて、なぜこの答えが間違っているのか理解します.構造パディングの概念を理解する必要がある.

    パディングの概念

  • プロセッサは一度に1バイトではなく1ワードを読み込む.
  • 32ビットプロセッサ→1ワード単位で−4バイト→1 CPUサイクル(1ワード=4バイト).
  • 64ビットプロセッサ→1ワード単位で−8バイト→1 CPUサイクル(1ワード=8バイト).
  • CPUサイクルの数は性能に反比例する.
  • これは、CPUのサイクル数がより少ない特定のタスクを実行するためにかかることを意味します.
  • CPUサイクル数が増加すると性能が低下する.

  • これはCPUサイクルの不必要な無駄です.ここでは,構造パディングの概念を紹介した.
  • どうやって動くの?


    これは自動的にコンパイラによって行われ、CPUのサイクルのnoを保存し、したがってパフォーマンスを向上させます.


    今、オブジェクトのサイズは8バイトではなく6バイトです.
    より明確にするために、スペースの分配を議論しましょう:
  • 占有された= 1バイトcharデータ型
  • 占領された= 1バイト
  • 空いている行は占有された= 2バイトC占領= 4バイトをつくりましたintデータ型.
  • したがって、構造体のサイズは1 + 1 + 2 + 4 = 8バイトです.
    そこでここで性能を向上させましたが、空きメモリの作成によってメモリが無駄になります.

    よりよく理解するためのより良い例


    別の例を見てみましょう.
    1.  #include<iostream.h>   
    2.  struct student  
    3.  {  
    4.     char a;  
    5.     int b;  
    6.    char c;  
    7.  };  
    8.  int main()  
    9.  {  
    10.    struct student stud1; // variable declaration of the student type..  
    11.    // Displaying the size of the structure student.  
    12.    printf("The size of the student structure is %d", sizeof(stud1));  
    13.    return 0;  
    14. }  
    
    メモリの割り当てを見てみましょう.

    構造オブジェクトの合計サイズは4 + 4 + 4 = 12バイトです.

    Cで構造パディングを避ける方法?


    構造パディングは、コンパイラが自動的に行う組み込みのプロセスです.時々、それが実際のサイズから構造のサイズを増やすので、我々はそれを避ける必要があります.
    2つの方法でパディングを避けることができます.
  • 属性の再配置.
  • <研究ノート>シュン・プラグマ・パック( 1 )
  • 属性/変数の再配置
    パディングのために手動でメモリの無駄を減らす一つの方法があります.
    より多くのサイズを含んでいる変数が最初に宣言されるように、我々はデータ変数を並べることができます、そして、小さいサイズを持つ変数は宣言されなければなりません.
    例を通して理解する
    15. #include<iostream.h>  
    16. struct student  
    17. {  
    18.    Int a;  
    19.    char b;  
    20.   char c;  
    21. };  
    22. int main()  
    23. {  
    24.    struct student stud1; // variable declaration of the student type..  
    25.    // Displaying the size of the structure student.  
    26.    printf("The size of the student structure is %d", sizeof(stud1));  
    27.    return 0;  
    28. }  
    
    割り当てを見てみましょう.

    structオブジェクトの合計サイズは4 + 1 + 1 = 6バイトです.
    を使用して
    1.  #include<iostream.h>   
    2.  #pragma pack(1)  
    3.  struct base  
    4.  {  
    5.      int a;  //4 bytes
    6.      char b;  //1 byte
    7.      double c;//8 bytes  
    8.  };  
    9.  int main()  
    10. {  
    11.   struct base var; // variable declaration of type base  
    12.   // Displaying the size of the structure base  
    13.   printf("The size of the var is : %d", sizeof(var));  
    14. return 0;  
    15. } 
    

    ここでプラグマを使うのを避けるなら、オブジェクト構造のサイズは4 + 4 + 4 + 4 = 16バイトになります.
    しかし、構造体の実際のサイズは13バイトであるので、3バイトを無駄にします.メモリの無駄を避けるために、1バイトのパッケージを提供するために、Count - Phagma Pack ( 1 )ディレクティブを使用します.