1

我得到以下 56 个字节。谁能解释这是怎么回事?

#include <stdio.h>

typedef struct how_many_bytes {
    long s[4];
    char c, e;
    int i[2];
    char *d;    
} How_Many_Bytes;

int main(){    
    printf("%lu ", sizeof(How_Many_Bytes));
}

不应该是 (4*8) + 1 + 1 + 2(用于填充)+ 4 + 4 + 8 = 52 字节

4

2 回答 2

3

因为它是 64 位机器,所以填充6不是2在您的计算中。

此外,您应该使用%zu打印size_t.

于 2013-10-09T03:05:30.270 回答
0

您的分析是正确的,只是在成员之前有额外的 4 个字节填充char *d。这是为了使d成员在 8 字节边界上对齐。

这个结构在 x86-64 上的pahole输出是:

struct how_many_bytes {
        long int                   s[4];                 /*     0    32 */
        char                       c;                    /*    32     1 */
        char                       e;                    /*    33     1 */

        /* XXX 2 bytes hole, try to pack */

        int                        i[2];                 /*    36     8 */

        /* XXX 4 bytes hole, try to pack */

        char *                     d;                    /*    48     8 */

        /* size: 56, cachelines: 1 */
        /* sum members: 50, holes: 2, sum holes: 6 */
        /* last cacheline: 56 bytes */
};      /* definitions: 1 */

无论您如何重新排列此结构的成员,您的填充总长度都不会超过 6 个字节。成员的大小总和为 50 字节,结构成员的最大对齐为 8,因此即使以最佳顺序排列成员,结构末尾也会有 6 字节的填充以对其进行舍入大小为 8 的下一个最大倍数。

于 2013-10-09T03:38:43.717 回答