1、数据成员的声明顺序和内存布局
变量的布局顺序与它的声明顺序是一致的。
我们先来看一段代码:
class Base {
public:
// 变量地址
void print() {
cout << " this:" << this << endl;
cout << " &i1:" << &i1 << endl;
cout << " &i2:" << &i2 << endl;
cout << " &i3:" << &i3 << endl;
}
// 变量偏移量
void print_offset() {
printf(" Base::i1 = %d\n", &Base::i1);
printf(" Base::i2 = %d\n", &Base::i2);
printf(" Base::i3 = %d\n", &Base::i3);
}
private:
int i1;
int i2;
int i3;
};
int main()
{
Base base;
base.print();
printf("\n");
base.print_offset();
}
我们看到输出的地址是这样的:
从这些地址我们可以看到,变量的布局顺序与它的声明顺序是一致的。
下面我们把变量的声明修改一下,分别看一下修改后的输出地址。
(1)
int i1;
static int is;
int i2;
int i3;
(2)
int i1;
void print2();
int i2;
int i3;
(3)
public:
int i1;
private:
int i2;
int i3;
从测试结果看,变量i1, i2, i3的输出顺序并没有发生变化,我们可以得出这样的结论:
(1)变量的访问属性public, protected, private对变量的布局顺序没有影响;
(2)变量中间添加static变量和成员函数对变量的布局顺序也没有影响。
2、字节对齐对数据成员内存布局的影响
(1)比如我们声明如下的变量:
这里我说明下,int占4个字节,short占2个字节。
int i1;
short s1;
int i2;
short s2;
输出地址是这样的:
内存布局是这样的:
(2)现在我们把变量的声明顺序修改一下:
int i1;
int i2;
short s1;
short s2;
输出地址是这样的:
内存布局是这样的: