3

彼らがここhttp://en.wikipedia.org/wiki/Data_structure_alignmentで言ったように、私は常に、「構造の合計サイズが任意の構造体メンバーの最大アライメントの倍数"

したがって、このような構造体の場合、そのサイズは 32 プロセッサで 16 になります。

typedef struct
{
   double   s;  /* 8 bytes */
   char     c;  /* 7 bytes padding at the end of make the total size 8*2 */
} structa_t;  

で、サイズが16ではなく12でビックリ!何故ですか ?誰かがそれに光を当てることができますか?

sizeof(double) = 8
sizeof(structa_t) = 12

ところで、システム情報

$ uname -a
Linux 2.6.18-8.el5xen #1 SMP Thu Mar 15 21:02:53 EDT 2007 i686 i686 i386 GNU/Linux
$ gcc --version
gcc (GCC) 4.1.1 20070105 (Red Hat 4.1.1-52)
4

3 に答える 3

5

ここでのキーワードは次のとおりです。

...構造体の合計サイズは、構造体メンバーの最大の配置の倍数である必要があります...

システムでは、aの配置doubleは8ではなく4です。

C1xを待つ場合は、_Alignof演算子を使用できます(と同様sizeof)。システムでは、

sizeof(double) == 8
_Alignof(double) == 4

C89では、より原始的な方法でアライメントをテストできます。

#include <stdlib.h>
struct char_double { char x; double y; };
#define DOUBLE_ALIGNMENT offsetof(struct char_double, y)

またはマクロを使用して、

#define alignof(x) offsetof(struct { char a; x b; }, b)
于 2011-08-29T04:34:17.533 に答える
2

ウィキペディアは、このような詳細について特に信頼できる情報源ではありません。

この場合、構造体の最大のアイテムのサイズは、構造体全体がパディングされる可能性のあるサイズの(かなり難しい)上限を形成します-しかし、実装は、それが見た場合よりも少ないパディングを自由に使用できますフィット。多くの場合、「Nビット」プロセッサ、特定の構造体に適した最大のパディングは、1)構造体内の最大のアイテム、または2)プロセッサ自体の「ビット数」のいずれか小さい方になります。 (したがって、32ビットプロセッサでは、32ビット境界よりも大きいデータ項目であっても、32ビット境界よりも大きくする必要がない/必要がないことがよくあります)。

于 2011-08-29T04:31:07.343 に答える
0

あなたの場合、構造が単語境界に整列されているためです(単語= 4バイト)。

于 2011-08-29T04:24:34.770 に答える