Geo*_*rge 10 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;
};
Run Code Online (Sandbox Code Playgroud)
当我这样做时,在我期待33 岁的时候sizeof(region)给我40分.
有任何想法吗?
(mingw gcc,win x64 os)
Cla*_*diu 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));
Run Code Online (Sandbox Code Playgroud)
long long int每个值为8个字节. scale只有1个字节但填充对齐,因此它实际上也占用了8个字节. 5*8 = 40.
正如其他人所说,结构被填充以进行对齐,这种填充不仅取决于成员的类型,而且还取决于它们所定义的成员的顺序.
例如,考虑这两个结构A并B定义如下.两种结构在成员和类型方面都是相同的; 唯一的区别是成员定义的顺序不同:
struct A
{
int i;
int j;
char c;
char d;
};
struct B
{
int i;
char c;
int j;
char d;
};
Run Code Online (Sandbox Code Playgroud)
请问sizeof(A)等于sizeof(B)只是因为他们已经相同数量的同类型的成员?不.试着打印每个尺寸:
cout << "sizeof(A) = "<< sizeof(A) << endl;
cout << "sizeof(B) = "<< sizeof(B) << endl;
Run Code Online (Sandbox Code Playgroud)
输出:
sizeof(A) = 12
sizeof(B) = 16
Run Code Online (Sandbox Code Playgroud)
惊讶吗?请亲自查看输出:http://ideone.com/yCX4S