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