结构的不同大小元素的顺序

时间:2013-10-02 14:56:30

标签: c

我目前想知道如果元素的大小不同,是否有一种很好的方法来排序结构元素。

以下哪个例子最好?

示例1:

struct
{
   u8  my_u8;
   u8  my_u8_2;
   u32 mu_u32;
}

示例2:

struct
{
   u32 mu_u32;
   u8  my_u8_2;
   u8  my_u8;
}

如果我在两种情况下都声明了一个结构,那么内存是否需要相同的内容?

2 个答案:

答案 0 :(得分:3)

从具有大对齐的对象进行排序通常应该产生最紧密的结构,即示例2更好。但在你的情况下,两个例子都会在大多数架构中产生相同大小的结构。

您的示例1需要8个字节:

+------+------+------+------+------+------+------+------+
| u8   | u8_2 | (padding since u32 must be aligned in a |
|      |      |  4-byte boundary)                       |
+------+------+------+------+------+------+------+------+
| u32                                                   |
|                                                       |
+------+------+------+------+------+------+------+------+

您的示例2还需要8个字节:

+------+------+------+------+------+------+------+------+
| u32                                                   |
|                                                       |
+------+------+------+------+------+------+------+------+
| u8   | u8_2 | (padding since the whole struct aligns  |
|      |      |  to 4-byte boundary since it has u32.)  |
+------+------+------+------+------+------+------+------+

一个不好的例子是

struct {
    u8  my_u8;
    u32 my_u32;
    u8  my_u8_2;
};

需要12个字节:

+------+------+------+------+------+------+------+------+
| u8   | (padding since u32 must be aligned in a 4-byte |
|      |  4-byte boundary)                              |
+------+------+------+------+------+------+------+------+
| u32                                                   |
|                                                       |
+------+------+------+------+------+------+------+------+
| u8_2 | (padding since the whole struct aligns to      |
|      |  4-byte boundary)                              |
+------+------+------+------+------+------+------+------+

答案 1 :(得分:2)

只有在最小化结构中的填充是绝对至关重要的时候才这样做,例如:如果你有大量这样的结构并且内存很紧,那么它只是过早优化而且代码可读性/可维护性会受到影响。

如果确实如此,那么一般的想法就是按照大小的降序排列元素,所以在你的情况下是例子。