私は次の構造体を持っています
struct node{
int value;
struct node *next;
struct node *prev;
};
そして、サイズは sizeof(integer) よりも大きくなければならないと思います。
しかし、この構造体全体のサイズを計算する方法はわかりにくいです。
では、サイズを計算する方法は?
つまり、コンピューターではなく手で手動で計算したいのです...
サイズは少なくともsizeof(int) + sizeof(struct node *) + sizeof(struct node *)
です。ただし、必要に応じてコンパイラがパディングバイトを構造に追加できるため、それ以上になる場合があります。
大きsizeof(int)
さsizeof(struct node*)
はシステムによって異なります。32 ビット システムの場合はそれぞれ 4 バイトになる可能性が高く、64 ビット システムの場合は 8 バイトになる可能性があります。しかし、確実に知る唯一の方法は、コンパイラを使用してサイズを出力することです。
32 ビット アプリケーションについて話している場合、整数とポインターは 4 バイトです。したがって、構造体のサイズは 12 バイトです。
struct node{
int value; // 0x0 - 0x4
struct node *next; // 0x4 - 0x8
struct node *prev; // 0x8 - 0xC
};
組み立て:
struct [0xDEADBEEF] {
int 0x0;
struct node *0x4;
struct node *0x8;
};
補足事項[[0xDEADBEEF]+0x0] で読み取られるメモリ ポインターは、node->value などの現在の値を返します。
sizeof (struct node)
構造体のバイト単位のサイズです。
これは以下と同等です:
= sizeof (int)
+ potential unnamed padding1
+ sizeof (struct node *)
+ potential unnamed padding2
+ sizeof (struct node *)
+ potential unnamed padding3
メンバー間および構造体の末尾のパディングのサイズは実装定義です。
通常、構造体のサイズは各メンバ フィールドのサイズの加算です。ただし、コンパイラは、メンバーを適切にパディング/整列するために、いくつかの余分なバイトを追加する場合があります。
だからあなたの場合、
sizeof(struct node) = sizeof(int) + sizeof(struct node *) + sizeof(struct node *)
12 = 4 + 4 + 4 (on 32-bit)
20 = 4 + 8 + 8 (on 64-bit)
これは一般的なガイドラインであり、選択したコンパイラ/プラットフォームによって異なる場合があります。
c++: 正しい方法は、int plain_size()
必要な構造体ごとにメソッドを初期化することです。
struct anotherstruct {
...
static int plain_size(){...};
}
struct struct1 {
int a;
int b;
anotherstruct c;
static int plain_size() {
return sizeof(a)+sizeof(b)+anotherstruct::plain_size();
}
}
このサイズは、構造体に割り当てられたメモリ サイズと等しくない可能性があることに注意してください。