Sizeof (struct)返回意外值

sizeof(struct) returns unexpected value

本文关键字:意外 返回 struct Sizeof      更新时间:2023-10-16

这应该很简单,但我不知道在哪里寻找问题:

我有一个结构体:
struct region
{
public:
    long long int x;
    long long int y;
    long long int width;
    long long int height;
    unsigned char scale;
};

当我做sizeof(region)时,当我期望33时,它给了我40

任何想法?

填充结构体以适应8字节的边界。所以它实际上占用了40字节的内存——sizeof返回了正确的值。

如果您希望它只占用33个字节,那么指定packed属性:

struct region
{
public:
    long long int x;
    long long int y;
    long long int width;
    long long int height;
    unsigned char scale;
} __attribute__ ((packed));

long long int值为8字节。scale只有1个字节,但是为了对齐而填充,所以它也有效地占用了8个字节。5*8 = 40 .

如前所述,结构体是为对齐而填充的,这种填充不仅取决于成员的类型,还取决于定义它们的成员的顺序

例如,考虑下面定义的AB这两个结构体。这两个结构体在成员和类型方面是相同的;唯一的区别是定义成员的顺序不同:
struct A
{
    int i;
    int j;
    char c;
    char d;
};
struct B
{
    int i;
    char c;
    int j;
    char d;
};

sizeof(A)是否等于sizeof(B)仅仅因为它们具有相同类型的相同数量的成员?不。试着打印每个

的大小
cout << "sizeof(A) = "<< sizeof(A) << endl;
cout << "sizeof(B) = "<< sizeof(B) << endl;
输出:

sizeof(A) = 12
sizeof(B) = 16

惊讶吗?查看自己的输出:http://ideone.com/yCX4S