sizeof(struct)返回意外值

时间:2011-04-08 14:16:59

标签: c++ gcc struct mingw sizeof

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

我有一个结构:

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

有什么想法吗?

(mingw gcc,win x64 os)

3 个答案:

答案 0 :(得分:10)

它填充结构以适应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));

答案 1 :(得分:5)

long long int值各为8个字节。 scale仅为1个字节,但是为了对齐而填充,因此它实际上也占用了8个字节。 5*8 = 40

答案 2 :(得分:5)

正如其他人所说,结构被填充以进行对齐,这种填充不仅取决于成员的类型,还取决于其中成员的顺序他们被定义了。

例如,请考虑以下定义的这两个结构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