2012-04-01 24 views
8

私はCode :: Blocks IDEをGNU GCCコンパイラで使用しています。C/C++:構造体内のデータをパッキングまたはパディングする

struct test 
{ 
    char a; 
    char e; 
    char f; 
    char b; 
    char d; 
}; 

sizeof(test)戻り5

私はこの答え読み:sizeof(test)戻り6または8ように、どのように Why isn't sizeof for a struct equal to the sum of sizeof of each member?

は、最後のchar後のパディングがない来ますか? shortintなどを追加すると、私は一度質問することができるより多くの質問があります。しかし、私はこの質問が今は良いと思う。パディングしないと、プロセッサが構造体を扱いやすくなりますか?

答えて

10

charの位置合わせは1つだけなので、大きなアライメント要件を満たすようにパディングされるべき構造体のための必要はありません。

+0

私のワードサイズが4バイトだとします。私は配列 'test stuff [1000]'を持っているとしましょう。私のプロセッサは 'char-char-char-char char-pad-pad-pad'のような個々の' test'を読み込みます。メモリ内の配列をこのようにフォーマットする必要はありませんか? – newprogrammer

+0

@newprogrammerいいえ。配列のメンバー間、構造体のメンバーの間にパディングなしで5000バイトになります。 – asaelr

+0

@newprogrammer:構造体に "単語"がないので、 "単語"に必要な配置は無関係です。 –

1

ほとんどの回で、あなたは、一度に1人のメンバーと協力、または構造体のアドレスを渡しているので、コンパイラは、そのメンバーのために必要なアライメントよりも全体の構造体以上を揃えるために気にしません。つまり、この構造体を割り当てる(または関数に渡す)と、プロセッサはメンバーごとにそれを読み取らなければなりません。 (それは少し遅くなります)。

関連する問題