其他分享
首页 > 其他分享> > c – 对于所有对象类型T,sizeof(T)> = alignof(T)总是这样吗?

c – 对于所有对象类型T,sizeof(T)> = alignof(T)总是这样吗?

作者:互联网

对于任何对象类型T,总是这样的情况,sizeof(T)至少与alignof(T)一样大吗?

直观地看起来如此,因为即使你调整对象的对齐方式,例如:

struct small {
  char c;
};

通常情况下,它们的“大小”也会向上调整,以便在保持对齐的同时,阵列中对象之间的关系是有意义的(至少在我的testing中.例如:

struct alignas(16) small16 {
  char c;
};

两者的大小和对齐都是16.

解决方法:

至少在标准C中,对于你可以制作数组(长度> 1)的任何东西,这必须是真的.如果你有

Foo arr[2];

和alignof(Foo)> sizeof(Foo),然后arr [0]和arr [1]不能同时对齐.

但是,正如Zalman Stern’s example所示,至少有一些编译器允许您声明一个对齐大于其大小的类型,结果是编译器根本不允许您声明该类型的数组.这不符合标准C(它使用类型属性,即are a GCC extension),但这意味着您可以使用alignof(T)> sizeof(T)在实践中.

数组参数假定sizeof(Foo)> 0,对于标准支持的任何类型都是如此,但o11c shows是编译器扩展破坏该保证的示例:一些编译器允许0长度数组,0 sizeof和positive alignof.

标签:c,c11,memory-alignment,alignof
来源: https://codeday.me/bug/20190928/1827345.html