码迷,mamicode.com
首页 > 编程语言 > 详细

C++内存对齐

时间:2014-11-18 00:20:36      阅读:354      评论:0      收藏:0      [点我收藏+]

标签:ar   使用   sp   bs   as   size   c++   nbsp   c   

class A

{

};

sizeof(A)得到的不是0而是1,因为我们在申明类型实例的时候,它必须在内存中占有一定的空间,否则无法使用这些实例,

具体占用多少内存由编译器决定,上面是我在VS2008上得出的结果。

class A

{

char a;

};

这个sizeof出来的结果是1,不是4,在只有一个char型成员的情况下并没有内存对齐(VS2008)。

class A

{

char a;

char b;

};

得到2(没特别申明其他编译器就是VS2008)。

class A

{

int a;

char b;

};

得到8。

class A

{

char c;

int a;

char b;

};

得到12。

class A

{

int a;

char b;

char c;

};

得到8。

 

上面的例子已经很清楚表明什么事内存对齐了...

下面看看加入虚函数后的情况:

class A
{
virtual void fun();
};

得到4,因为内含一个虚指针,一般的编译器默认把这个虚指针放到最后。

class A
{
char a;
virtual void fun();
};

得到8;

class A
{
char a;
virtual void fun();
char b;
};

这样还是8。

class A
{
int d;
char a;
virtual void fun();
char b;
};

得到12。

class A
{
char b;
int d;
char a;
virtual void fun();

};

得到16。

 

 

再来看看在继承中可能会出现的状况,Lippman在深度探索C++对象模型中给出了很多种情况,

特别是涉及到虚拟继承和多继承时,我经验太少,现在还没见到。或者不适用被慢慢摒弃了吧。

这里面涉及的内容太复杂了,跟编译器有关,不同的编译器策略不同,以后有机会在总结下。

class A
{
char b;
int d;
virtual void fun();
char a;

};
class B:public A
{
char h;
virtual void test();
};
int _tmain(int argc, _TCHAR* argv[])
{
cout<<sizeof(A)<<endl;
cout<<sizeof(B)<<endl;

}

得到16,20

class A
{

int d;
virtual void fun();
char a;
char b;
};
class B:public A
{
char h;
virtual void test();
};
int _tmain(int argc, _TCHAR* argv[])
{
cout<<sizeof(A)<<endl;
cout<<sizeof(B)<<endl;

getchar();
return 0;
}

得到还是12,16。

也就是说继承来的父类那块内存完整保存,包括父类的虚指针。

 

 

上面并没有尝试各种可能情况,也许你会有意外发现,可以一起分享,睡觉喽!

C++内存对齐

标签:ar   使用   sp   bs   as   size   c++   nbsp   c   

原文地址:http://www.cnblogs.com/Mr-Zhong/p/4104639.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!