3

C の一部の構造にパディングがあることがわかっています。次の 2 点を考慮してください。

struct node1 {
      int a;
      int b;
      char c;
};

struct node2 {
      int a;
      char c;
      int b;
};

sizeof(int) = alignof(int)= 4 バイトと仮定:
sizeof(node1) = sizeof(node2) = 12、パディングのため。

2つのパフォーマンスの違いは何ですか? (もしあれば、コンパイラーまたはシステムのアーキテクチャー、特に GCC の場合)

4

4 に答える 4

4

これらは悪い例です。どちらの場合もパディングの量は同じであるため、この場合は問題ではありません。パフォーマンスの違いはありません。

コンパイラは常に末尾のパディングを埋めようとstructしますが、構造体の配列を使用することは不可能です。これは、最初のメンバーが常に整列されている必要があるためです。いくつかの item の末尾のパディングがない場合struct_array[0]、 の最初のメンバーがstruct_array[1]ずれてしまいます。


ただし、これを行う場合は順序が重要になります。

struct node3 {
      int  a;
      char b;
      int  c;
      char d;
};

int4 バイトと 4 バイトのアラインメントを想定すると、bここで 1+3 バイトを占有しd、さらに 1+3 バイトを占有します。2 つのメンバーが隣接して配置されている場合、これはより適切に記述された可能性がありますchar。この場合、パディングの合計量は 2 バイトになります。

于 2020-09-10T08:36:48.623 に答える