Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

構造体のsizeofがC/C ++の各メンバーのsizeofの合計と等しくないのはなぜですか?


sizeof()によって取得される構造体型要素のサイズは、必ずしも個々のメンバーのサイズと同じではありません。コンパイラは、配置の問題を回避するためにパディングを追加する場合があります。そのため、サイズが変わる場合があります。パディングは、構造体メンバーの後に、より大きなサイズのメンバーが続く場合、または構造体の最後に追加されます。コンパイラが異なれば、アライメント制約のタイプも異なります。 C標準では、全体的な配置構造は実装によって異なります。

ケース1

この場合、double zの長さは8バイトであり、x(4バイト)よりも大きくなります。そのため、別の4バイトのパディングが追加されます。また、短い型のデータyのメモリには2バイトのスペースがあるため、パディングとして6バイトが追加されます。

構造体のsizeofがC/C ++の各メンバーのsizeofの合計と等しくないのはなぜですか?

サンプルコード

#include <stdio.h>
struct myStruct {
   int x; //Integer takes 4 bytes, and padding 4 bytes
   double z; //Size of double is 8-byte, no padding
   short int y; //Size of short is 2-byte, padding 6-bytes
};
main() {
   printf("Size of struct: %d", sizeof(struct myStruct));
}

出力2

Size of struct: 24

ケース2

この場合、最初にdoubleが挿入され、8バイトのスペースが必要になります。ここで、整数x(4バイト)が追加されます。したがって、別の4バイトのスペースがあります。短いyを追加すると、その余分な4バイトのスペースに配置でき、合計16バイトのスペースを占有します。

構造体のsizeofがC/C ++の各メンバーのsizeofの合計と等しくないのはなぜですか?

サンプルコード

#include <stdio.h>
struct myStruct {
   double z; //Size of double is 8-byte, no padding
   int x; //Integer takes 4 bytes, and padding 4 bytes
   short int y; //Size of short is 2-byte, padding 6-bytes
};
main() {
   printf("Size of struct: %d", sizeof(struct myStruct));
}

出力2

Size of struct: 16

ケース3

3番目のケースでも、16バイトのメモリスペースが必要ですが、配置が異なります。最初のメンバーがdoubleであるため、最初に配置され、次に短いタイプのデータが追加されます。これで、整数を挿入しようとしたときに、残りの6バイトの領域に配置できます。したがって、短い後に1つのパディングが存在しますが、整数データの後にパディングは必要ありません。

構造体のsizeofがC/C ++の各メンバーのsizeofの合計と等しくないのはなぜですか?

サンプルコード

#include <stdio.h>
struct myStruct {
   double z; //Size of double is 8-byte, no padding
   short int y; //Size of short is 2-byte, padding 6-bytes
   int x; //Integer takes 4 bytes, and padding 4 bytes
};
main() {
   printf("Size of struct: %d", sizeof(struct myStruct));
}

出力2

Size of struct: 16

  1. 三角マッチ棒番号のC/C ++プログラム?

    マッチ棒を使用して作成された三角形は、正三角形を作成するように配置されます。これは、三角形のマッチ棒番号と呼ばれます。三角形のマッチ棒の数は、マッチ棒を三角形にするために必要なマッチ棒の数です。 この問題では、数はマッチ棒のピラミッドXの床であり、私たちのタスクは、x階のマッチ棒のピラミッドを形成するために必要なマッチ棒の最小総数を印刷するプログラムを作成することです。 概念をより明確にする例を見てみましょう。 Input: 7 Output: 84 説明 これは三角数の拡張です。整数Xの場合、必要なマッチ棒はX番目の三角数の3倍、つまり(3 * X *(X + 1))/ 2になります。

  2. 放物線の頂点、焦点、および直接線を見つけるためのC / C ++プログラム?

    ここでは、CまたはC ++プログラムを使用して、放物線の頂点、フォーカスdirectrixを見つける方法を説明します。これらのパラメータを取得するには、放物線の一般方程式が必要です。一般式は-です。 𝑦 = 𝑎𝑥2 + 𝑏𝑥 + 𝑐 a、b、cの値が示されています。 頂点の式- フォーカスの式- Directrixの式--y− 例 #include <bits/stdc++.h> using namespace std; void getParabolaDetails(float a, float b, float c) {