我目前想知道如果元素的大小不同,是否有一种很好的方法来排序结构元素。
以下哪个例子最好?
示例1:
struct
{
u8 my_u8;
u8 my_u8_2;
u32 mu_u32;
}
示例2:
struct
{
u32 mu_u32;
u8 my_u8_2;
u8 my_u8;
}
如果我在两种情况下都声明了一个结构,那么内存是否需要相同的内容?
答案 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)
只有在最小化结构中的填充是绝对至关重要的时候才这样做,例如:如果你有大量这样的结构并且内存很紧,那么它只是过早优化而且代码可读性/可维护性会受到影响。
如果确实如此,那么一般的想法就是按照大小的降序排列元素,所以在你的情况下是例子。