短いメンバーを含む C 構造体のサイズが必ずしもメンバー サイズの倍数にならないのはなぜですか?

Barbara Streisand
リリース: 2024-10-26 13:00:29
オリジナル
526 人が閲覧しました

Why is the size of a C struct with short members not always a multiple of the member size?

C 構造体のメモリ アライメントを理解する

メモリ アライメントは、データがメモリに格納され、プロセッサによってアクセスされます。構造体のコンテキストでは、メモリ アライメントは、構造体の個々のメンバーがメモリ内でどのようにレイアウトされるかを決定します。

次の構造体を考えてみましょう:

<code class="c">typedef struct {
    unsigned short v1;
    unsigned short v2;
    unsigned short v3;
} myStruct;</code>
ログイン後にコピー

メモリ アライメントが行われる 32 ビット マシンでは、通常、4 バイトに設定されている場合、この構造体の合計サイズは 8 バイトであると予想されます。ただし、sizeof(myStruct) 演算子は 6 バイトのみを返します。

構造体の各メンバーは unsigned short であり、サイズが 2 バイトであるため、矛盾が生じます。すべてのメンバーは同じサイズであるため、メンバー間にパディングは挿入されません。結果として、構造体はメモリ内で 6 バイトを占有します。

次に、構造体を変更しましょう:

<code class="c">typedef struct {
    unsigned short v1;
    unsigned short v2;
    unsigned short v3;
    int i;
} myStruct;</code>
ログイン後にコピー

この場合、サイズが 1 の int メンバーが存在します。 4 バイト、構造体のメモリ アライメントを変更します。 int メンバーは 4 バイト境界に配置する必要があります。前に 6 バイトがあるため、v3 と i の間に 2 バイトのパディングが挿入されます。これにより、sizeof(myStruct) で確認できるように、構造体の合計サイズは 12 バイトになります。

要約すると、C 構造体のメモリ アライメントにより、メンバーがメモリ内で適切にアライメントされ、プロセッサのパフォーマンスが最適化され、メモリ使用量が削減されます。 。型は、型自体と同じ大きさの境界にのみ位置合わせされます。より大きな型が導入されると、構造体全体の位置合わせが設定され、必要な位置合わせを維持するためにパディングが導入される可能性があります。

以上が短いメンバーを含む C 構造体のサイズが必ずしもメンバー サイズの倍数にならないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!