2011-04-08 126 views
10

这应该是简单的,但我不知道到哪里寻找这个问题:的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)它给了我当我期待。

任何想法?

(MinGW的GCC,赢得x64操作系统)

+0

@sth:这些编辑的要点是什么? – eriktous 2011-04-08 14:51:36

+1

@eriktous:我喜欢这个问题,并试图通过删除没有添加任何内容的文本来提高信噪比。 – sth 2011-04-08 15:41:15

回答

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)); 
+7

请注意,使用“packed”结构数组会严重阻碍性能,因为结构中的元素未对齐。 – 2011-04-08 14:21:47

+0

谢谢! – George 2011-04-08 14:23:29

+2

有没有办法获得某种packed_sizeof(MyStruct)?这样,可以使用结构解压缩,并获得良好的性能,但你可以使用结构的真正大小从文件中读取 – codymanix 2011-04-08 14:25:32

5

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

+0

辉煌,我不知道...有什么办法避免它?想要从文件中读取结构,并且需要获得确切的大小 – George 2011-04-08 14:20:38

+0

@George:通常会将数据存储为纯文本而不是二进制格式。请查看Pragmatic Programmer手册中的纯文本部分。 – ssegvic 2011-04-08 14:28:19

+0

@ssegvic:谢谢,但文件是从外部源提供的。 – George 2011-04-08 14:29:44

4

正如其他说,结构体被填充于比对,并且这种衬垫不仅依赖于类型成员,而且还对顺序他们限定在其成员

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

+2

谢谢 - 有趣 – George 2011-04-08 15:00:17