类型对齐是否会修改类型大小?

时间:2015-09-30 10:02:54

标签: c++

我编写了以下代码并在gcc上进行了测试:

// firstly some platform-specific workarounds
#if _MSC_VER
#define ALN_BEGIN(x) __declspec(align(x)) 
#define ALN_END(x)
#define alignof(x) __alignof(x)
#else
#define ALN_BEGIN(x)
#define ALN_END(x) __attribute__((aligned(x)))
#define alignof(x) __alignof__(x)
#endif

// struct have three 4-byte members, but aligned at 32 byte
ALN_BEGIN(32) struct Foo
{
    float a;
    float b;
    float c;
} ALN_END(32);

// show its size and alignment
int main(int argc, char** argv)
{
    printf("size %d, alignment%d\n", sizeof(Foo), alignof(Foo));
}

当我使用gcc编译并运行时,尽管Foo的所有成员只有12个字节,sizeof(Foo)得到32,这是对齐大小。那么尺寸扩展是根据语言标准(可靠)还是只是GCC的一个功能?

我正在创建一个对象池类,所以我必须精确地处理类型大小和对齐。

2 个答案:

答案 0 :(得分:9)

是的,这与标准一致。 sizeof (X)基本上定义为数组中两个连续X个对象的起始地址之间的偏移量。如果由于对齐限制而导致这些对象无法紧密相互关联,sizeof会相应增加。

引用C ++ 14,5.3.3 / 2:

  

......申请时   对于一个类,结果是该类的对象中的字节数,包括所需的任何填充   将该类型的对象放在数组中。 ......申请时   到数组,结果是数组中的总字节数。这意味着 n 数组的大小   元素 n 乘以元素的大小。

(强调我的)

答案 1 :(得分:1)

sizeof的结果,对于任何类型(char类型除外,其定义大小为1),是实现定义的,并且受到对齐的影响。但是,如果

  • sizeof(float)4;
  • 你的结构包含三个floats; AND
  • 结构的开头和结尾都对齐到32字节边界。

那么你可以期待你看到的行为。