我目前想知道如果元素的大小不同,是否有一种对结构元素进行排序的好方法。
以下哪个例子最好?
示例 1:
struct
{
u8 my_u8;
u8 my_u8_2;
u32 mu_u32;
}
示例 2:
struct
{
u32 mu_u32;
u8 my_u8_2;
u8 my_u8;
}
如果我在两种情况下都声明一个结构,内存是否需要相同?
我目前想知道如果元素的大小不同,是否有一种对结构元素进行排序的好方法。
以下哪个例子最好?
示例 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 更好。但是在您的情况下,这两个示例都会在大多数架构中产生相同大小的结构。
您的示例 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) |
+------+------+------+------+------+------+------+------+
仅当最小化结构内的填充绝对至关重要时才这样做,例如,如果您有大量此类结构并且内存很紧,否则它只是过早的优化并且代码可读性/可维护性将受到影响。
如果确实是这种情况,那么一般的想法是按大小递减的顺序对元素进行排序,因此 Example2 在您的情况下。