在像下面这样的代码中,我们通常在结构的末尾有一个2字节的隐式填充:
struct foo {
int32_t x ;
int16_t y ;
// <<< 2 bytes for total sizeof(foo) == 8
} ;今天有人问我,聚合初始化器如何处理额外的两个字节:
foo o = { 0, 0 } ;ie:这是不是相当于
foo o ;
memset( &o, 0, sizeof(foo) ) ;我不知道,所以我建议不要依赖它(聚合缩写器无论如何都很麻烦,所以这是一个很好的通用建议)。
有没有人知道,当平台ABI需要特定结构的隐式填充时,C语言规范是否说明了聚合初始化对隐式填充的作用?
发布于 2010-07-23 02:27:45
引用自C99标准,“类型表示”,6.2.6:
当值存储在结构或联合类型的对象(包括成员对象)中时,与任何填充字节相对应的对象表示的字节将采用未指定的值。
简而言之,它不是由语言指定的;它取决于C编译器/接口实现者。
发布于 2010-07-23 02:22:06
我相当确定对填充的初始化没有要求。例如,对于一个实现来说,向每个结构添加填充是完全合法的,并让它存储一个标记,告诉它是什么类型的结构来支持运行时类型检查。在这种情况下,大多数结构将包含始终为非零的填充。
https://stackoverflow.com/questions/3311993
复制相似问题