我编写了以下代码并在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的一个功能?
我正在创建一个对象池类,所以我必须精确地处理类型大小和对齐。
答案 0 :(得分:9)
是的,这与标准一致。 sizeof (X)
基本上定义为数组中两个连续X
个对象的起始地址之间的偏移量。如果由于对齐限制而导致这些对象无法紧密相互关联,sizeof
会相应增加。
引用C ++ 14,5.3.3 / 2:
......申请时 对于一个类,结果是该类的对象中的字节数,包括所需的任何填充 将该类型的对象放在数组中。 ......申请时 到数组,结果是数组中的总字节数。这意味着 n 数组的大小 元素 n 乘以元素的大小。
(强调我的)
答案 1 :(得分:1)
sizeof
的结果,对于任何类型(char
类型除外,其定义大小为1
),是实现定义的,并且受到对齐的影响。但是,如果
sizeof(float)
是4
; floats
; AND 那么你可以期待你看到的行为。