C++类空间大小关于内存对齐的学习
2016-06-30 13:16
183 查看
1.空类空间大小为1,为什么,每个实例在内存中都有一个独一无二的地址,为了达到这个目的,编译器往往会给一个空类隐含的加一个字节,这样空类在实例化后在内存得到了独一无二的地址,所以空类所占的内存大小是1个字节。
2.类空间内存大小计算
摘自http://www.jb51.net/article/45406.htm
从结构体的首地址开始向后依次为每个成员寻找第一个满足条件的首地址x,该条件是x % N = 0,并且整个结构的长度必须为各个成员所使用的对齐参数中最大的那个值的最小整数倍,不够就补空字节。
即类空间大小是成员中内存最大值的最小整数倍(这个值大于等于所有成员内存和),这里所说的成员内存最大值是针对基础类型而言的,这里记为MAX,(http://blog.csdn.net/lyl0625/article/details/7350045),根据类成员顺序依次寻址,寻址时按实际的成员内存大小(基础类型大小)依次往后,以一个MAX为一段内存,如果新寻址的内存超过了边界,那就新增一个MAX内存,从新增的MAX首地址开始存放。如下:
class test
{
public:
test()
{
cout<<"test len:"<<sizeof(test)<<" test addr:"<<(int)this<<" a:"<<(int)&a<<" b:"<<(int)&b<<" c:"<<(int)&c<<endl;
}
private:
int a;
double b;
char c;
};
结果:test len:24 test addr:2686720 a:2686720 b:2686728 c:2686736
3.由于内存对齐对类空间大小的影响,所以我们在摆放类成员时,最好能根据成员内存大小有序的摆放;如下
代码一
class test
{
public:
test()
{
cout<<"test len:"<<sizeof(test)<<endl;
}
private:
int a;
int b;
char c;
char d;
};
输出结果长度是12;
代码二
class test
{
public:
test()
{
cout<<"test len:"<<sizeof(test)<<endl;
}
private:
int a;
char d;
int b;
char c;
};
输出结果长度为16;
2.类空间内存大小计算
摘自http://www.jb51.net/article/45406.htm
从结构体的首地址开始向后依次为每个成员寻找第一个满足条件的首地址x,该条件是x % N = 0,并且整个结构的长度必须为各个成员所使用的对齐参数中最大的那个值的最小整数倍,不够就补空字节。
即类空间大小是成员中内存最大值的最小整数倍(这个值大于等于所有成员内存和),这里所说的成员内存最大值是针对基础类型而言的,这里记为MAX,(http://blog.csdn.net/lyl0625/article/details/7350045),根据类成员顺序依次寻址,寻址时按实际的成员内存大小(基础类型大小)依次往后,以一个MAX为一段内存,如果新寻址的内存超过了边界,那就新增一个MAX内存,从新增的MAX首地址开始存放。如下:
class test
{
public:
test()
{
cout<<"test len:"<<sizeof(test)<<" test addr:"<<(int)this<<" a:"<<(int)&a<<" b:"<<(int)&b<<" c:"<<(int)&c<<endl;
}
private:
int a;
double b;
char c;
};
结果:test len:24 test addr:2686720 a:2686720 b:2686728 c:2686736
3.由于内存对齐对类空间大小的影响,所以我们在摆放类成员时,最好能根据成员内存大小有序的摆放;如下
代码一
class test
{
public:
test()
{
cout<<"test len:"<<sizeof(test)<<endl;
}
private:
int a;
int b;
char c;
char d;
};
输出结果长度是12;
代码二
class test
{
public:
test()
{
cout<<"test len:"<<sizeof(test)<<endl;
}
private:
int a;
char d;
int b;
char c;
};
输出结果长度为16;