2013-11-25 105 views
3

我在我的代码中有一个struct iof_header,我确定它的宽度是24个字节。我执行一个sizeof(iof_header),它返回32个字节宽。结构如何存储在内存中?

问题1 为什么它是32字节宽而不是24?

问题2 包括它的成员,结构如何存储在内存中?

问题3 我发现我创建字节我的结构之一[4-8 & 20-24]都为NULL的任何时间,我看到这种明显的在我的字符数组。该阵列的内容如下{4 bytes of BASEID_Code, 4 NULL bytes, 8 bytes of zeroed padding, 4 bytes of ASID_Code, 4 NULL bytes, 8 bytes of size} 我的unsigned __int32成员末尾有空字节,为什么会发生这种情况?

这可能与编译有关吗?可能是使CPU能够更快地处理这些数据类型的一项有效工作?

struct      iof_header 
{ 
    union 
    { 
     struct 
     { 
      unsigned __int32  BASEID_Code; 
      unsigned __int64  padding; 
      union 
      { 
       char     ASID_Type[4]; 
       unsigned __int32  ASID_Code; 
      }; 
      unsigned __int64  Size; 
     }header; 
     char     header_c[24]; 
    }; 
    iof_header() 
    { 
     header.ASID_Code = 0; 
     header.BASEID_Code = 0; 
     header.Size = 0; 
     header.padding = 0; 
    } 
}; 
+10

某物和一个char [32]的'union'怎么能有小于32字节的大小? –

+1

去阅读这个externation-http://en.wikipedia.org/wiki/Data_structure_alignment – OldProgrammer

+0

这已被问及已答复一百万次。你所有的三个问题。如果有的话,你应该发布_separately_。 –

回答

5

为什么它是32字节而不是24字节?

可能是因为在每个__int64成员之前添加填充以满足其对齐要求。

包括它的成员,结构如何存储在内存中?

成员存储在顺序,填充插入在必要时每个相对于所述结构的起始部件正确对齐。

有些编译器有一个非标准扩展名来“包装”成员,所以不插入填充。例如,在GCC上,可以在结构定义之后放置__attribute__((packed))

可能是使CPU能够更快地处理这些数据类型的一种有效方法吗?

是的。在某些处理器上,未对齐的访问速度很慢;在别人身上,他们根本不被允许,必须通过两次或多次访问来模拟。

+0

谢谢,这帮助我了解了很多。我通过试验和错误修复了一些问题。 –

2

编译器可以在成员之后自由添加填充字节以保留对齐要求。您的__int64成员可能会对齐到8个字节,请参阅BASEID_Codepadding之间的4个填充字节。