为什么sizeof()在64位cpu上有所不同?

Kon*_*tin 5 c

考虑以下示例:

#include <stdio.h>
#include <inttypes.h>

struct A {
        uint32_t i1;
        uint32_t i2;
        uint32_t i3;
        uint64_t i4;
        uint32_t i5;
        uint32_t i6;
        uint32_t i7;
        uint64_t i8;
        uint32_t i9;
};

struct B {
        uint32_t i1;
        uint32_t i2;
        uint32_t i3;
        uint32_t i4;
        uint32_t i5;
        uint32_t i6;
        uint32_t i7;
        uint64_t i8;
        uint64_t i9;
};

int
main()
{
        struct A a;
        struct B b;

        printf("sizeof(a) = %u, sizeof(b) = %u\n", sizeof(a), sizeof(b));

        return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

$ ./t2 
sizeof(a) = 56, sizeof(b) = 48
$ 
Run Code Online (Sandbox Code Playgroud)

他们为什么在64位机器上有所不同?在32位平台上的结果是相同的:

$ ./t2
sizeof(a) = 44, sizeof(b) = 44
Run Code Online (Sandbox Code Playgroud)

Jul*_*ano 23

一些图表可以帮助您了解:

32位:

+----+----+----+----+----+----+----+----+----+----+----+
| i1 | i2 | i3 |   i4    | i5 | i6 | i7 |   i8    | i9 | Struct A
+----+----+----+----+----+----+----+----+----+----+----+

+----+----+----+----+----+----+----+----+----+----+----+
| i1 | i2 | i3 | i4 | i5 | i6 | i7 |   i8    |   i9    | Struct B
+----+----+----+----+----+----+----+----+----+----+----+
Run Code Online (Sandbox Code Playgroud)

64位:

+---------+---------+---------+---------+---------+---------+---------+
| i1 | i2 | i3 |~~~~|    i4   | i5 | i6 | i7 |~~~~|   i8    | i9 |~~~~| Struct A
+---------+---------+---------+---------+---------+---------+---------+

+---------+---------+---------+---------+---------+---------+
| i1 | i2 | i3 | i4 | i5 | i6 | i7 |~~~~|   i8    |   i9    | Struct B
+---------+---------+---------+---------+---------+---------+
Run Code Online (Sandbox Code Playgroud)
  • +:地址边界
  • :填充


Meh*_*ari 8

编译器通过边界(在编译尝试中不同)对齐struct成员.

添加一个

#pragma pack (1)
Run Code Online (Sandbox Code Playgroud)

指令在源文件的开头并重试.

  • 如果您想知道元素的排列方式,请输出每个元素的指针(printf("%p",A.i1);依此类推). (2认同)
  • @schnaader你想要&a.i1,不是吗? (2认同)