对结构和工会的尺寸感到困惑

时间:2014-12-16 00:35:04

标签: c sizeof

来自某个地方的问题要求标注这个结构部件的大小,我不知道如何通过初始化来说明大小。对答案的任何解释都会有所帮助。 如果有帮助,系统是32位。

  • sizeof( struct Artist_A )
  • sizeof( artist_record )
  • sizeof( artist_record[1].record )
  • sizeof( artist_record[1].group )

    struct Artist_A {
       short group;
       char title[20];
       union Rec{
          void * ptr;
          int num;
          char character;
          double real;
      } record;
     };
    
    struct Artist_A artist_record[200];
    

3 个答案:

答案 0 :(得分:1)

分配给联合的内存量足以容纳联盟中最大的成员。在32位系统上的示例中,您将拥有32个字节的大小。它细分如下:

  • 4个字节用于短路(2个字节,另外2个额外字节用于校准)
  • char数组的20个字节
  • 联合中最大类型的8个字节(双精度)

i686 Linux(Ubuntu)上的sizeof(Artist_A)确认了这一点

答案 1 :(得分:1)

这是您在GCC编译器上获得此代码的结果,

truct Artist_A {
   short group;
   char title[20];
   union Rec{
      void * ptr;
      int num;
      char character;
      double real;
  } record;
 };

struct Artist_A artist_record[200];
int main(){
    /* %zu is used as sizeof() returns std::size_t */
    printf("%zu\n",sizeof( struct Artist_A )); 
    printf("%zu\n",sizeof( artist_record ));
    printf("%zu\n",sizeof( artist_record[1].record )); 
    printf("%zu\n",sizeof( artist_record[1].group )); 
}

输出:

32 
6400 
8 
2 

这些是必需的字节!

阐释:

struct Artist_A

  • short group:简称为4,即使短只需要2个字节Data structure alignment!数据对齐意味着将数据放在存储器偏移量等于字大小的某个倍数。在32位系统中,字大小为4字节(而在x64中则为8字节)。这实际上提高了性能。

  • char title[20]:取20个字节,即char为20个元素的一个字节。

  • uinion record:根据官方文档,联盟只有保留其最大数据成员所需的大小。所以它又增加了8个字节。

答案 2 :(得分:0)

联盟至少其最大成员的大小;它可能更大以满足任何对齐要求(例如,如果union的最大成员是char的17元素数组,但系统需要4字节对齐,那么并集的大小可能是填充到20个字节。

类似地,结构的成员之间可能存在填充,也是为了满足对齐要求;因此,sizeof报告的大小可能大于各个成员的大小总和。

因此,union Rec至少与real成员一样大,在32位系统上最可能是8个字节。因此struct Artist_A至少为8 + 20 + sizeof (short),至少为2;假设它是30个字节,可能还有2个额外的填充字节,总共为32个字节。