2

誰かがこのコードの出力を説明してもらえますか?

#include <iostream>
using namespace std;

struct Yo{
    char sex;
    int a;
};

int main() {
    Yo c;
    cout<<sizeof(c.sex);
    cout<<endl<<sizeof(c.a);
    cout<<endl<<sizeof(c);
    return 0;
}

出力: 1 4 8

ストラクチャー8のサイズは?

4

2 に答える 2

1

構造体のパディング(別名メモリアライメント)のため。アラインメントは 2 のべき乗でなければなりません (C11 は @KeithThompson が述べたように 6.2.8p4 でこれを明示的にします)。また、構造体の合計サイズが 5 であるため、最も近い 4 の倍数は 8 であるため、8 になります。アライメントは 2 の累乗でなければなりません。

#pragma packぴったりサイズでお使いいただけます。

#pragma pack(push, 1) /* set alignment to 1 byte boundary */
struct A {
    char s;
    int a;
};
#pragma pack(pop) // restore to default

警告: #pragma pack標準 C にはありません。また、構造体に 4 バイト アラインメントが必要であるという前提もありません。@KeithThompsonが述べたように。

「型のサイズはそのアラインメントの倍数でなければなりませんが、サイズは 2 の累乗である必要はありません。たとえば、4 バイトの int を想定すると、次のような構造struct { int a, b; char d; }はアラインメントが 4 でサイズが 12 になる可能性があります。 . サイズは、最も近い 2 の累乗ではなく、配置の最も近い倍数です。- @キーストンプソン

パッキングは、メモリを減らすのに役立ちます。整数や固定長の char などでいっぱいの構造体がある場合に使用します。ポインターで使用するのが適切かどうかはわかりませんが、ポインターを使用する場合には有用ではありません (たとえばvoid *、構造体)。

詳細はこちら

于 2014-01-13T16:52:53.287 に答える