web-dev-qa-db-ja.com

構造体のサイズを見つけるにはどうすればよいですか?

struct a
{
    char *c;
    char b;
};

Sizeof(a)とは何ですか?

27
praveen
#include <stdio.h>

typedef struct { char* c; char b; } a;

int main()
{
    printf("sizeof(a) == %d", sizeof(a));
}

32ビットマシンで「sizeof(a)== 8」を取得します。構造の合計サイズはパッキングに依存します:私の場合、デフォルトのパッキングは4です。したがって、「c」は4バイト、「b」は1バイトを取り、3のパディングバイトを残して4の次の倍数にします。 :8.このパッキングを変更したい場合、ほとんどのコンパイラーは、例えばMSVCでそれを変更する方法があります。

#pragma pack(1)
typedef struct { char* c; char b; } a;

sizeof(a)== 5を指定します。これを行う場合は、ライブラリヘッダーの前にパッキングをリセットするよう注意してください。

33
Simon Buchan

他の回答のいくつかが言っていることとは反対に、ほとんどのシステムでは、プラグマまたはコンパイラオプションがない場合、構造体のサイズは少なくとも6バイト、ほとんどの32ビットシステムでは8バイトになります。 64ビットシステムの場合、サイズは簡単に16バイトになります。調整が有効になります。常に。単一の構造体のサイズは、それらのサイズの配列を割り当てることができ、問題のプロセッサに対して配列の個々のメンバーが十分に整列している必要があります。その結果、他の人が仮定したように構造体のサイズが5である場合、そのような2つの構造体の配列は10バイト長になり、2番目の配列メンバーのcharポインターは奇数バイトに整列します(ほとんどの場合)プロセッサ)は、パフォーマンスの大きなボトルネックを引き起こします。

9

手動でカウントする場合、構造体のサイズは、アライメントを考慮した後の各データメンバーのサイズになります。構造体に魔法のオーバーヘッドバイトはありません。

4
Jeff Hubbard

正確な値はsizeof(a)です。
リスクを取ることもできますが、この場合は2以上、16以下であると想定します。

2
eugensk00

これは、アーキテクチャと基本的なデータ型の処理方法によって異なります。また、システムが自然なアライメントを必要とするかどうかにも依存します。

1
mdec

私はあなたが構造体を意味し、厳密ではないと仮定しますが、32ビットシステムでは、コンパイラが構造体をパディングしているかどうかに応じて5バイトまたは8バイトになります。

0
Cody Brocious

「strict」ではなく「struct」を意味し、「Char」ではなく「char」を意味すると思われます。

サイズは実装に依存します。ほとんどの32ビットシステムでは、おそらくポインター用に5〜4バイト、文字用に1バイトです。ここでアライメントが機能するとは思わない。ただし、「c」と「b」を入れ替えると、サイズが8バイトに増加する場合があります。

OK、試してみました(g ++ 4.2.3、-gオプション付き)。

0
Fred Larson

構造体のサイズは、32ビットシステムでは8バイトである必要があります。そのため、構造体のサイズは2の倍数になります。これは、構造の最後に3バイトを埋め込むことで実現されます。

構造体のcharの後にポインターが宣言されている場合、サイズは8バイトのままですが、ポインター(4バイト要素)を4バイトのアドレス境界に揃えるために3バイトのパディングが追加されます。

経験則では、要素はバイトサイズの倍数のオフセットにあり、構造自体は2の倍数のサイズでなければなりません。

0
computinglife