【问题标题】:Finding the correct size of a misaligned structure找到未对齐结构的正确大小
【发布时间】:2013-12-12 21:17:43
【问题描述】:
 typedef struct structA 
{
   char        C;
   double      D;
   int         I;
} structA_t;
 

这个 structA_t 结构的大小:

sizeof(char) + 7 字节填充 + sizeof(double) + sizeof(int) = 1 + 7 + 8 + 4 = 20 字节

但这是错误的,正确的是

24

。为什么?

【问题讨论】:

  • 可以对齐到 8 字节。
  • 额外的4 用于在int 之后进行填充
  • @RajuKundhe 为什么在 int 之后需要 4?你能详细说明一下吗?
  • 请查看Structure Padding 和padding。
  • @gpuguy 字长为 8 字节(取决于处理器)。 int 长度为 4 字节(取决于平台),因此必须额外填充 4 个字节,同样sizeof(char)=1 Byte 必须填充 7 个字节

标签: c


【解决方案1】:

我的猜测是您系统中int 的大小是 4 字节,因此 int 还必须填充 4 字节才能达到 8 字节的字长。

total_size=sizeof(char) + 7 Byte padding + sizeof(double) + sizeof(int) + 4 Bytes padding = 24 Bytes

【讨论】:

    【解决方案2】:

    在最后一个ìnt 之后很可能有 4 字节填充。

    如果sizeof(double) == 8 则很可能alignof(double) == 8 也在您的平台上。 考虑这种情况:

    structA_t array[2];
    

    如果大小仅为 20,则 array[1].D 将未对齐(地址可被 4 整除,而不是需要对齐的 8)。

    【讨论】:

    • @H2CO3 我对 x86 没有太多经验。我提到它更像是:“如果您遇到这个问题,那么您的平台可能有这个限制(您当前的平台可能是什么)。”
    【解决方案3】:

    char = 1 字节

    double = 8 个字节

    int = 4 个字节

    对齐到双 =>

    padding char => 1+7 
    
    padding double => 8+0
    
    padding int => 4+4
    

    => 24 字节

    或者简单地说,就是最大的倍数 => 3(字段数)*8(最大的大小)=24

    【讨论】:

    • 为什么你到处都对齐到双倍。如果没有替身,你的答案是什么?
    • @gpuguy 正如 user694733 在他/她的回答中所说的那样,结构会错位,如果按 int 对齐,则可以被 4 而不是 8 整除。在许多平台上,考虑了最大的字段,并且其余的都与它对齐。不知道你的,你可以尝试将你的结构重新定义为 {char, int, double} 并查看填充后的大小是否更小......但再次不确定它是否适用于你的情况
    • @gpuguy 处理器是面向单词的。您将需要知道 CPU 的字长。根据您的描述,它是 64 位的。因此,对于要对齐的数据,必须通过填充将每个数据带到 64 位 = 8 字节(假设您的系统上为 1 字节 = 8 位,这令人惊讶地并非在所有系统上总是如此)。在这种情况下,平台上 4 个字节长的 int 必须填充 4 个字节。双精度为 8 字节长,因此不需要填充。
    【解决方案4】:

    关于填充/对齐的好文章: http://www.drdobbs.com/cpp/padding-and-rearranging-structure-member/240007649

    由于 double 成员,它强制所有内容为八字节对齐。

    如果你想要一个更小的结构,那么下面的结构只给你 16 个字节!

    typedef struct structA 
    {
       int         I;
       char        C;
       double      D;
    } structA_t;
    

    【讨论】:

    • 对不起,错字:末尾的双精度为 16 个字节;重新排序结构成员有帮助。
    猜你喜欢
    • 2014-12-01
    • 1970-01-01
    • 2021-12-24
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多