C‐データ構造における構造パディング
5364 ワード
この記事では、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?
メモリは、オブジェクトが宣言された後にのみ、構造体のメンバーに割り当てられます.一旦我々が宣言するならば、メモリのオブジェクト連続ブロックは構造メモリに割り当てられます.
宣言された順番に割り当てられます.
例でわかりましょう.
したがって、すべてのデータ型の上記のサイズを考慮すると、構造オブジェクトのサイズは一般的なルールに対して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バイトです.
そこでここで性能を向上させましたが、空きメモリの作成によってメモリが無駄になります.
別の例を見てみましょう.
構造オブジェクトの合計サイズは4 + 4 + 4 = 12バイトです.
構造パディングは、コンパイラが自動的に行う組み込みのプロセスです.時々、それが実際のサイズから構造のサイズを増やすので、我々はそれを避ける必要があります.
2つの方法でパディングを避けることができます. 属性の再配置. <研究ノート>シュン・プラグマ・パック( 1 ) 属性/変数の再配置
パディングのために手動でメモリの無駄を減らす一つの方法があります.
より多くのサイズを含んでいる変数が最初に宣言されるように、我々はデータ変数を並べることができます、そして、小さいサイズを持つ変数は宣言されなければなりません.
例を通して理解する
structオブジェクトの合計サイズは4 + 1 + 1 = 6バイトです.
を使用して
ここでプラグマを使うのを避けるなら、オブジェクト構造のサイズは4 + 4 + 4 + 4 = 16バイトになります.
しかし、構造体の実際のサイズは13バイトであるので、3バイトを無駄にします.メモリの無駄を避けるために、1バイトのパッケージを提供するために、Count - Phagma Pack ( 1 )ディレクティブを使用します.
目次:
若干の基本を思い出しましょう
メモリは、オブジェクトが宣言された後にのみ、構造体のメンバーに割り当てられます.一旦我々が宣言するならば、メモリのオブジェクト連続ブロックは構造メモリに割り当てられます.
宣言された順番に割り当てられます.
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である.
しかし、この答えは間違っています.さて、なぜこの答えが間違っているのか理解します.構造パディングの概念を理解する必要がある.
パディングの概念
どうやって動くの?
これは自動的にコンパイラによって行われ、CPUのサイクルのnoを保存し、したがってパフォーマンスを向上させます.
今、オブジェクトのサイズは8バイトではなく6バイトです.
より明確にするために、スペースの分配を議論しましょう:
そこでここで性能を向上させましたが、空きメモリの作成によってメモリが無駄になります.
よりよく理解するためのより良い例
別の例を見てみましょう.
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つの方法でパディングを避けることができます.
パディングのために手動でメモリの無駄を減らす一つの方法があります.
より多くのサイズを含んでいる変数が最初に宣言されるように、我々はデータ変数を並べることができます、そして、小さいサイズを持つ変数は宣言されなければなりません.
例を通して理解する
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 )ディレクティブを使用します.
Reference
この問題について(C‐データ構造における構造パディング), 我々は、より多くの情報をここで見つけました https://dev.to/pallavi121/structure-padding-in-c-data-structures-3jjjテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol