2011-02-25 66 views

回答

3

这是非常依赖架构的,而且您没有指定您所在的系统是什么类型。

然而,假定

  • char:1字节的大小,没有对准
  • short:2字节大小,对齐,以2字节边界
  • int:4字节大小,对齐,以4个字节边界
  • double:8字节大小,对齐到8字节边界

这很容易解释。

 
+------+ +------+ 
| char | 0 | char | 
+------+ +------+ 
|  | 1 |  | 
+------+ |  | 
|  | 2 |  | 
| short| |  | 
|  | 3 |  | 
+------+ |  | 
|  | 4 |  | 
|  | |  | 
|  | 5 |  | 
| int | |  | 
|  | 6 |  | 
|  | |  | 
|  | 7 |  | 
+------+ +------+ 
|  | 8 |  | 
|  | |  | 
|  | 9 |  | 
|  | |  | 
|  | 10 |  | 
|  | |  | 
|  | 11 |  | 
|double| |double| 
|  | 12 |  | 
|  | |  | 
|  | 13 |  | 
|  | |  | 
|  | 14 |  | 
|  | |  | 
|  | 15 |  | 
+------+ +------+ 
     16 |  | 
      |  | 
     17 |  | 
      | int | 
     18 |  | 
      |  | 
     19 |  | 
      +------+ 
     20 |  | 
      | short| 
     21 |  | 
      +------+ 
     22 |  | 
      |  | 
     23 |  | 
      +------+ 

在结构中有空的空间(称为填充),因为某些数据结构必须落在特定的字节边界上。

请注意,结构作为一个整体必须对齐到8个字节边界以维持其成员的对齐;这就是为什么第二个版本的尾部会有额外的填充。

5

该结构的alignment是不同的。

第一结构:

struct csie { 
    char c; 
    short s; // 3 bytes + 1 bytes of padding 
    int i; // 4 bytes 
    double e; // 8 bytes 
}; 

struct ceis { 
    char c; //1 byte + 7 bytes of padding 
    double e; // 8 bytes 
    int i; // 4 bytes 
    short s; // 2 byte + 2 bytes of padding 
}; 

在第一结构中的炭和短可以包装到同一对准块,而在第二结构他们不能。

+1

正确的原因,错误的计算。 – 2011-02-25 05:36:29

+0

您对csie的回答很有道理。你对ceis的回答不像总共20字节,他的输出是24? – Pete 2011-02-25 05:37:05

+0

是的,我意识到短之后是2个字节。我也忘记了双打可以是8字节对齐。 – GWW 2011-02-25 05:37:20

0

几乎可以肯定有事情做与对齐。不同的类型在内存中必须以不同的方式对齐,并且由于一个结构的元素与另一个结构的顺序不同,所以它们的排列方式不同。

这些差异如何发挥出架构,操作系统和编译器之间的差别很大。有关更多具体信息,请参阅the Wikipedia article和您的操作系统/编译器手册。

0

许多机器要求数据类型对准以在存储器适当边界。在你的情况下,可能CPU需要双倍对齐到8个字节的边界。

所以炭,短和INT在第一结构只需要以1个字节来填充,而在第二结构是必需的只是炭和双之间7个字节的填充。

0

您使用的是64位计算机。因此所有的分配都在64位(8字节)的块中。 double是8个字节,并且必须位于其自己的块中。其他字段可以共享块。

显然编译器是不够成熟的,以节省空间,在你结构的第二个版本:

  • 它分配为焦炭的第一个块,从而浪费了大部分的块。
  • 它为double分配第二个块。
  • 它分配为int和短的第三块。
相关问题