没有合适的资源?快使用搜索试试~ 我知道了~
C++对象内存布局---vc 怎么布局每个 c++ 对象,以及怎样完成指针的转换的过程
需积分: 15 13 下载量 164 浏览量
2009-02-28
15:05:28
上传
评论
收藏 46KB DOC 举报
温馨提示
试读
6页
vc 怎么布局每个 c++ 对象,以及怎样完成指针的转换的过程. c++ 标准不规定 c++ 实现的时候的对象的具体的内存布局,除了在某些方面有小的限制以外,c++ 对象在内存里面的布局完全是由编译器自行决定,这里只是讨论 vc++ .net 2003 build 7.1.3091 的实现方式.
资源推荐
资源详情
资源评论
C++对象内存布局
写这个文章完全是因为想要搞清楚 vc 怎么布局每个 c++ 对象,以及怎样完成指针的转换的过程.
先问一个问题,两个不同类型的指针相互转换以后,他们在数值上是一样的吗?比如:
int nValue = 10;
int *pInt = &nValue;
void *pVoid = pInt;
char *pChar = (char*)pInt;
这些指针的值(不是说指针指向的内存的内容)是一样的吗? 如果你的回答是 yes,那如果是一个类的继
承体系呢?在继承类向基类转换的过程中,指针的数值还是不变化的么?如果你的回答是"不一定会变化,要看
类的体系是怎么设计的 "的话,那恭喜你,不用看下去了.如果你还不确定究竟变还是不变,究竟哪些变,哪些不
变,究竟为什么要变为什么不变的话,接着看下来.
c++ 标准不规定 c++ 实现的时候的对象的具体的内存布局,除了在某些方面有小的限制以外,c++ 对象
在内存里面的布局完全是由编译器自行决定,这里我也只是讨论 vc++ .net 2003 build 7.1.3091 的实现方式,我
并没有在 vc5 vc6 vc.net 2002 以及其他的 2003 build 上面做过测试,结论也许不适合那些编译平台.这些属于
编译器具体实现,ms 保留有在不通知你我的情况下作出更改的权利.废话这么多,马上开始.
对于 c 的内建指针的转换,结果是不用多讨论的,我们只是讨论 c++ 的对象.从最简单的开始.
class CBase
{
public:
int m_nBaseValue;
};
这样的一个类在内存里放置是非常简单的,他占有 4 个 bytes 的空间,不用多说,我们从他派生一个类出
来.
class CDerive1 : public CBase
{
public:
int m_nDerive1Value;
};
CDerive1 的对象在内存里面是怎么放的呢? 也很简单,占有 8 个 bytes 的空间,前 4 个 bytes 属于 CBase
类,后四个 bytes 属于自己.一个 CDerive1 的指针转换成一个 CBase 的指针,结果是一样的.下面我们加上多重
继承看看.
class CFinal : public CDerive,public CBase // 这里的 CDerive 是一个和 CBase 差不多的基类
{
资源评论
songhangcheng
- 粉丝: 0
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功