这应该很简单,但我不知道在哪里寻找问题:
我有一个结构:
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)
答案 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)
正如其他人所说,结构被填充以进行对齐,这种填充不仅取决于成员的类型,还取决于其中成员的顺序他们被定义了。
例如,请考虑以下定义的这两个结构A
和B
。两种结构在成员和类型方面都是相同的;唯一的区别是成员的定义顺序不一样:
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