结构体内存对齐问题
条件为32位操作系统,编译4字节对齐。
// 局部对齐原则:每一成员需对齐为后一成员类型的倍数
// 整体补齐原则:最终大小补齐为成员类型最大值的倍数
Struct A
{
Int a; // 4
Short b; // (4) + 2 = 6 下一元素为 int,需对齐为 4 的倍数, 6 + (2) = 8
Int c; // (8) + 4 = (12)
Char d; // (12) + 1 = 13, 需补齐为 4 的倍数,13 + (3) = 16
};
Struct B
{
Int a; // 4
Short b; // (4) + 2 = 6,下一成员为 char 类型,不考虑对齐
Char c; // (6) + 1 = 7,下一成员为 int 类型,需对其为 4 的倍数,7 + (1) = 8
Int d; // (8) + 4 = 12,已是 4 的倍数
}
结构体和联合混合内存对齐问题
如题纪念一下曾经踩过这么一个不应该踩的坑
话不多说先上代码
union Data
{
struct
{
int x;
int y;
}s; //8
int x; //4
int y; //4
}d;
d.x = 1;
d.y = 2;
d.s.x = d.x * d.x;
d.s.y = d.y + d.y;
cout << d.s.x << "," << d.s.y << endl; //打印结果:4 8
这里涉及到union联合的内存分配问题,union总的内存大小就是成员所占内存最大的成员内存大小;
给出上述程序代码的内存结构
混合内存对齐