0

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

以下哪个例子最好?

示例 1:

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

示例 2:

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

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

4

2 回答 2

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)                              |
+------+------+------+------+------+------+------+------+
于 2013-10-02T15:00:46.347 回答
2

仅当最小化结构内的填充绝对至关重要时才这样做,例如,如果您有大量此类结构并且内存很紧,否则它只是过早的优化并且代码可读性/可维护性将受到影响。

如果确实是这种情况,那么一般的想法是按大小递减的顺序对元素进行排序,因此 Example2 在您的情况下。

于 2013-10-02T14:59:54.960 回答